关于理解哈希表的除法散列法(取余法)
2014-10-16 13:58
190 查看
《算法精解:C语言描述》上提到的一种简单的将键值k映射到m槽位的方法:h(k)=k mod m。
而该书上写了一段话:“通常情况下,要避免m取2的幂,因为假设m=2^p,则h(k)是k的二进制数的低p位......,通常选择m会是一个素数,而且不那么靠近2的幂......”。这段话理由是:
以 m = 2^3 = 8 为例,如下图所示:
从概率的角度,出现相同的概率比较高,而通常我们希望 h(k) 的值依赖于 k 的所有位而不是最低 p 位,因为这样才会使得散列表看起来更均匀。当m不是素数时在散列分布时也会增加分布不均匀的机会,总的来说哈希函数的设计尽量使键值均匀、随机地分布在表中,其他方法可以参考《算法导论》。
而该书上写了一段话:“通常情况下,要避免m取2的幂,因为假设m=2^p,则h(k)是k的二进制数的低p位......,通常选择m会是一个素数,而且不那么靠近2的幂......”。这段话理由是:
以 m = 2^3 = 8 为例,如下图所示:
从概率的角度,出现相同的概率比较高,而通常我们希望 h(k) 的值依赖于 k 的所有位而不是最低 p 位,因为这样才会使得散列表看起来更均匀。当m不是素数时在散列分布时也会增加分布不均匀的机会,总的来说哈希函数的设计尽量使键值均匀、随机地分布在表中,其他方法可以参考《算法导论》。
相关文章推荐
- 关于关系代数中除法的理解以及如何用基本运算表示除法
- 关于除法与乘法逆元关系的一些理解
- C语言中关于除法和取余的理解
- 关于编码的一些认识和理解(Kemin原创)
- 关于com的理解
- 关于sizeof操作符的理解和总结
- 关于SCN的理解
- 关于DataRow和DataColumn的一点个人简单理解
- 关于Aspx页面的理解!
- 关于ref,out,params参数的理解(粘贴的源代码,说明在注释里面)
- 关于接口我的理解
- 关于流、输入和字符的理解一
- 关于String和StringBulider的理解
- 关于.NET中的整数除法
- 关于ref,out,params参数的理解
- 关于如何理解三层结构
- [聊天记录]关于一句话的理解
- 关于IOCP的更进一步理解
- Bob关于content management的理解!(转载)
- 关于测试代码必须做以下几件事情的下厨做菜理解法。