赞
踩
在构造散列函数时有几点需要加以注意:
(1)散列函数的定义域必须包括需要存储的全部数据元素的关键字,而如果散列表允许有m个地址时,其值域必须在0~m-1;
(2)散列函数计算出来的地址应能均匀分布在整个地址空间中,若kcy是从关键字集合中随机抽取的一个关键字,散列函数应能以同等概串取0到m-1中的每一个值;
(3)散列函数应是简单的,能在较短的时间内计算出结果。
方法 | 散列函数 | 适用性 | 优点/缺点 |
---|---|---|---|
直接定址法 | H(key)=a*key+c | 适用于查找表较小且连续的情况 | 【优】散列函数一对一映射,一般不会产生冲突【缺】如果关键字分布不连续,会浪费空间 |
数字分析法 | 各位的符号分布均匀度的公式 λk=Σ(i=1~r) (aik - n/r)2 | 仅适用于事先明确知道数据表中所有关键字每一位上数值符号的分布情况 | 依赖于关键字集合,如果换一个关键字集合,选择哪几位要重新决定 |
除留余数法 | H(key)=key %p | 不仅可以对关键字直接取模,也可在折叠、平方取中后再取模 | 若散列表表长为m,通常p为小于或等于表长(最好接近m)的最小质数,可以更好的减小冲突;除留余数法的地址计算方法简单,而且在许多情况下效果较好 |
乘余取整法 | H(key)=⌊n*(a*key%1)⌋ | 若地址空间为p位,就选2p;最佳的选择与带散列的数据表的特征有关,一般取a=0.6180339 | 【优】对n的选择不很关键 |
平方取中法 | 关键字平方的中间位数 | 适用于不知道关键字的分布,而位数又不是很大的情况 | |
随机数法 | H(key)=Random(key) | 适用于关键字的长度不等的情况 | 【优】对不同的关键字得到的哈希函数值不易产生冲突,由此产生的哈希地址也较为均匀;造表和查找都很方便 |
折叠法 | 将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位) | 适用于关键字位数较多,而且关键字中每一位上数字分布大致均匀的情况 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。