C#写算法之散列表
散列表也叫哈希表(hash table),这种数据结构提供了键(Key)和值(Value)的映射关系。 只要给出一个Key,就可以高效地查找到它所匹配的Value,时间复杂度接近于O(1)。 哈希表之所以查询效率这么高,是因为有一个中转站: 本质上,哈希表也是一个数组,但数组是通过下标访问值,所以,输入的key可以从一个中转站中,通过某种方式,把Key和数组下标进行转换。这个中转站就叫作哈希函数。 在不同的语言中,哈希函数的实现方式不一样。 在Java及大多数面向对象的语言中,每一个对象都有属于自己的hashcode,这个hashcode是区分不同对象的重要标识。无论对象自身的类型是什么,它们的hashcode都是一个整型变量。 既然都是整型变量,想要转化成数组下标就不难实现了。最简单的转化方式是:按照数组长度进行取模运算。 index = HashCode (Key) % Array.length 实际上,JDK中的哈希函数并没有直接采取取模运算,而是利用了位运算的方式来优化性能。在这里可以简单理解成取模操作。 通过哈希函数,我们可以把字符串或其他类型的key,转化成数组的下标index。 如给出一个长度为8的数组,则当 key = 001121时, index = HashCode ("001121")%Array.length = 1420036703 % 8 = 7