哈希表在处理数据查找、判断数据是否存在时非常的高效,但是哈希表在插入时可能会出现哈希冲突。而解决哈希冲突主要两种方式就是开散列与闭散列的解决方式,两者各有优点与缺点。而今天要说的解决哈希冲突的方式是建立多阶哈希表!
多阶哈希表
其实所谓多阶哈希表可以理解成多个数组,但是这些数组都是特殊的。这些数组的长度不一致,每个数组所能存储的元素个数都是一个素数(利用素数作为元素个数是避免产生哈希冲突的一种方式)。下面来画一个多阶哈希的简易图。
由于各阶哈希表的长度都不相同,所以相同的 key 在各阶哈希中根据法则得到的映射也大多不同,并且由于各个哈希表长度都为素数。这样来看多阶哈希表产生哈希冲突的可能就更小了。
这里的每一阶哈希表的长度从第一阶开始自上到下开始递减,并且都是素数。比如说有十阶哈希表,每阶哈希表最多存放 1000 个元素,那么就找出小于 1000 的最大的十个素数并排序,依次从大到小作为各阶哈希表的长度。
查找
在查找的时候,从第一阶开始,利用数据的 key 来求出对应的位置,看对应下标下是否为空,如果是空,那么一定不存在这个数据;如果不为空,再比较 key 的值,如果相等,证明找到了,如果不相等证明发生了哈希冲突,那么从第二阶继续寻找,以此类推,直至找到最后一阶。
插入
插入的时候,如果没有发生哈希冲突,那么照常插入。如果一旦发生哈希冲突,那么就在下一阶进行插入判断。多阶哈希在处理哈希冲突时非常的简单,当然开散列哈希桶的方式处理哈希冲突也很简单。
增容
但是一旦需要