首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

关于hash表的一个有关问题

2012-03-06 
关于hash表的一个问题一般算法教材中都会提到hash表的大小应该选择素数这是为什么捏?如果关键字完全是平均

关于hash表的一个问题
一般算法教材中都会提到hash表的大小应该选择素数
这是为什么捏?
如果关键字完全是平均分布的,是不是素数没什么区别吧?

[解决办法]
如果完全平均分布的确不需要的,但是确定会这样嘛
[解决办法]
素数冲突更少,平均分布就无所谓了
[解决办法]
的确,hash表关键在key的平均分布,冲突越多hash表效率越低。至于大小的选择主要两个参考因素:hash表最终所存储元素的数量和key分布。其目的是尽量提高效率降低存储浪费。同时还要考虑hash函数本身的效率。

我曾经做个一个试验,大数据量的url查找。在10万数量级以内的时候体现不出来hash查找的性能,还不如二分查找来的快呢。

曾经看过网上一片帖子转述了一个暴雪曾经用过的双路hash函数,说是冲突率极低,不过测试过以后发现这个hash函数本身效率就不高了。

[解决办法]
平均分布固然最好。但是不能拿最好情况来衡量哈希函数的效率。

根据具体情况设计哈希函数,才能使哈希函数高效。

线性同余法[也就是:f(x)=(a*x+b) mod m],应该是比较好的通用哈希方法。

至于哈希表的大小为什么是素数就比较好,有理论解释,但更多的是试验证明。

《计算机程序设计艺术》中也只是给了总结性的理论解释,也没有什么详细讨论。

况且,对于通用哈希函数,理论解释也不一定可靠。
比如,理论上认为:二阶同余法[也就是:f(x)=(a*x*x+b*x+c) mod m] 比线性同余法更随机,应当是更好的哈希函数。但大量实践却显示:线性同余法的表现要优于二阶同余法。
[解决办法]
若关键字完全是平均分布的,用素数还是合数效果差别不大。

热点排行