@散列表
hashtable,关键问题在于查找的时间优化和解决冲突。
1. 直接寻址表
index和key值直接相关,存储全域U
2. 散列表
即利用散列函数h由关键字k计算出槽的位置,采用函数h将全域U映射到散列表的槽位上。散列,顾名思义,希望h尽可能随机混杂,最大程度减少冲突。但由于h(k)的种数m<U, 所以一定会有冲突的情况产生。
2.1 解决冲突的方法
2.1.1 链接法
在链接法中,把散列到同一槽的所有元素都放在一个链表中。槽j中有一个指针,指向存储所有到j的元素的表头。其性能主要取决于散列函数。好的散列函数应满足简单均匀散列假设,即每个关键字都被等可能的散列到m个槽位中的任何一个。
2.2 散列法
2.2.1 除法散列法
h ( k ) = k m o d m , h(k)=k\ mod\ m, h(k)=k mod m,
其中 m m m应取一些不太接近2的整数幂的素数
2.2.2 乘法散列法
h ( k ) = f l o o r ( m ( k A m o d 1 ) ) , h(k) = floor(m(kA\ mod\ 1)), h(k)=floor(m(kA mod 1)),
其中 f l o o r ( ⋅ ) floor(\cdot) floor(⋅)表示向下取整,先用k乘上常数A(0<A<1),提取小数部分,再乘上m,向下取整。m一般取2的幂次,比较好实现。而A有文献表明取 ( 5 − 1 ) / 2 (\sqrt{5}-1)/2 (5−1)/2是个比较好的值。