算法导论_第十章_散列表
散列表大概就是把给每个要存储的数据都用散列函数给定一个关键字,对应到一个槽。
由于不同的信息可能对应同样的关键字,也就是说对应同一个槽,这时要解决其冲突,解决冲突可以用链接法,和开放寻址法。
对于链接法,其对于冲突采取链表进行解决,这样就保证了数据不会发生冲突。
其查找的平均时间为O(1+n/m)
11.3散列函数
一个好的散列函数能够将每个关键字都被等可能地散列到m个槽位中的任何一个,并与其他关键子已散列到哪个槽位无关。
除法散列法:h(k)=k mod m m接近a 但不接近2的任何次数
乘法散列法:h(k)=[m(kA mod 1)]
全域散列法:对于相同的关键字,其能够对应到不同的槽,这就要随机的选择一个作为散列函数。一对关键字发生冲突的原因的概率至多为1/m,我们根据期望的线性性可以得出 E[Y] = n/m = a E[Y] <a+1
所以其有良好的平均运行情况。
设计一个全域散列的函数类
开放寻址法:所谓开放寻址法,就是所有元素都放入散列表中,其避免了存储指针的空间,可以存储更多的节点。
其 re=h(k,j)
这样其为一个探查序列,为其一个排列。
线性探查: m种序列,其会出现集群现象。
二次探查: m种序列,其导致轻度集群。
双重散列: m*m种序列
由于知识水平有限,关于散列表的其他的一些知识,这里不再介绍,待以后补充!