1.哈希表最重要的作用是实现O(1)效率的查找,首先有一个哈希函数确定元素在表中的位置;其次是解决冲突,其实现主要有两种:
(1)链地址法:数组+链表
(2)探测法(开放地址法,线性、二次):哈希函数为 H[i](x)= (hash(x)+f(i)) mod TableSize 。H[i](x)为表中位置, f(i)为解决冲突的函数 f(0)=0,线性探测f(i)=i。
2.链地址哈希表装填因子一般接近1。链地址法当装载因子超过0.5时,性能急速下降,此时可以考虑扩展哈希表。其他还有布谷鸟散列和跳房子散列。
3.通用散列函数:Ha,b(x)=((ax+b) mod p) mod M 其中p为素数,M为表大小,0 <a,b<=p-1。
4.散列表不能直接找出最小、最大元素,跟排序相关的数据最好用二叉查找树(输入数据可能有序的时候一般不用,效率很差),不需要有序或者对输入数据有序存有怀疑可以选用哈希表。
5.对于任何带有实际名字而非数字的节点的图论问题优先考虑哈希表。
6.String类型的哈希值为各个字符的ASCII码值乘以37后累加而成,因为String对象是常量,所以进行再散列时我们可以避免昂贵的重复计算哈希函数,这个技巧叫做闪存散列代码。