散列
散列
散列表就是一个包含关键字的具有固定大小的数组。其优势在于以常数平均时间执行插入、删除和查找工作。
解决冲突
-
分离链接法:数组中包含的是一个链表,链表中的是冲突了的关键字
-
开放地址法:完全使用数组实现。如果有冲突发生,就尝试另外的单元,尝试h0(X),h1(X),h2(X),其中hi(X) = Hash(X) + F(i)。由于不同的F(i),因此分为:
-
- 线性探测法:F(i) = i 装填因子不能接近于1
-
- 平方探测法:F(i) = i^2 装填因子不能大于0.5
-
- 双散列:F(i) = i * Hash2(X),也即就是再使用一个哈希函数
再散列
对于使用平方探测的开放定址散列法,如果表的元素填的太满,那么操作的运行时间就会开始消耗的过长,且Insert操作可能会失败。所以进行再散列,也就是扩充原来表的大小。一般扩充为比原来的两倍大,且为素数的一个数
可扩散列
当散列表过大而装不进主存的时候使用。