数据结构 — 多阶哈希表

多阶哈希表


昨天在腾讯面试的时候,面试官问到我数据结构的时候,可能因为因为我前面答的还还不错就扩展了一下,在我之前对哈希的认知我知道的其实只

有开放定制法和开链法这种操作,不过当面试官问到多阶哈希和一致性哈希这种东西的时候! ??? 问的我一脸懵逼! 还是平时学习还是够细

致,对知识点没有扩展性的了解. 今天将这个多阶哈希记录下来.多阶哈希表其实就是一个锯齿般的数组,看起来就是下图那个样子:

1.每一行是一阶,上面的元素个数多,下面的元素个数依次减少. 每一行的元素个数都是素数. 每一阶数组的每一个节点用于存储数据的内容,其

中,节点的前四个字节用来存储int类型的Key或者是hash_code.

 2.创建多阶HASH的时候,用户通过参数来指定有多少阶,每一阶做最多有多少个元素. 那么每一阶应该选择多少个元素呢? 这里采用了素数集中

原理的算法来查找. 假如每阶最多有1000个元素,一共10阶,则算法选择十个比1000小的最大素数,从大到小排列,以此作为各阶的元素个数. 通

过素数集中的算法得到的10个素数分别是: 997 991 983 977 971 967 953 947 941 937. 可见虽然是锯齿数组,各层之间的差别并不是很多.

3.查找的过程,先将key在第一阶内取模,看是否是这个元素,如果这个位置为空,直接返回不存在; 如果是这个key,则返回这个位置. 如果这个

位置有元素,但是又不是key,则说明hash冲突了,再去第二阶去寻找. 循环往复.


大致多阶的思想我相信大家已经明白了! 现在我们考虑他和开链法比较起来优势和劣势

1.hash冲突处理的非常简单. 开链法其实也挺简单的都是找到位置他们的查找时间复杂度常规情况下都是O(1). 开链极端才会O(N)

2.有多个桶,使得空间利用率很高,你多阶哈希并不需要一个很大的桶来减少冲突.

3.开链法的增容做的事情将所有节点都要重新挂. 但是多阶哈希可以动态增长空间,不断加入新的一阶,且对原来的数据没有影响.

4.不过相对来说,多阶哈希是提前开辟好空间,而哈希桶是来一个添加一个,所以多阶哈希比较占用空间.

当然多阶哈希也会有自己不足的地方,比如每次查询就必须固定N次的HASH处理,而且在极端的情况下,如果N次HASH后,得到的每一个位置都被人

占用了,那么存在不能插入的可能. 不过这种可能性非常之低,并且空间利用率往往都已经在80%以上了.

并且阶层的选择对你考验也比较大,如果N设置过大,会影响处理速度,过于小负载能力就会减低. 由于我们的HASH算法本质还是通过质数取模的算

法.所以可以进行一定的测试来检查N值的影响,这里我没有这样搞我借用了一个大佬的研究成果尴尬




我们可以看到对HASH次数的增多,负载能力可以逐渐提高. 当然这个也必须权衡利弊,毕竟如果20次操作,对于平衡二叉树等算法,已经可以检索

100万的数据了.所以具体N的值,还是需要你按情况给.


资料收集:

百度搜索

http://blog.csdn.net/fullsail/article/details/6328702

http://blog.csdn.net/wm_1991/article/details/52218718

猜你喜欢

转载自blog.csdn.net/dawn_sf/article/details/79506520