您的位置:首页 > 理论基础 > 数据结构算法

散列表查询(哈希表)之散列函数的构造方法

2015-09-15 11:30 405 查看

1.散列函数的构造方法

1.1 直接定址法

去关键字的某个线性函数值为散列地址:f(key)=a*key+b(a、b为常数)
这样的散列函数优点就是简单均匀,也不会产生冲突,该方法适合查找表比较小且连续的情况。所以此方法虽然简单,但是并不常用。
1.2数字分析法
例如我们使用的电话号码的前七位极有可能是相同的,而后四位是不同的,所以我们选择电话号码的后四位作为我们的关键字成为散列地址就是不错的选择。如果还是可能发生冲突,我们还可以对抽出来的后四位数字进行反转(如1234改成4321)、右环位移(如1234改成4123)、左环位移、甚至前两位数与后两位数叠加(1234改成12+34=46)等方法。总的目的就是为了提供一个散列函数,能够合理的将关键字分配到散列表的各位置。
       抽取方法是使用关键字的一部分来计算散列存储位置的方法,在散列函数中是常用的手段。
        适用:
                 通常合理处理关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干分配比较均匀,就可以考虑适用这个方法。
1.3平法取中法
     此方法原理很简单,就和字面意思一样,假如关键字是数字1234,那么它的平方就是1522756,再抽取中间的3位就是227,用作散列地址。该方法比较适合不知道关键字的分布,而且位数又不是很大的情况。
1.4折叠法
折叠法是将关键字从左到右分割成位数相等的几部分(最后一部分位数不够可以短一些),然后将这几部分叠加求和,并按散列表表长,取后几位作为散列地址。
例如:987|654|321|0,四段相加得1962,再取后三位得到散列地址为962;有时候还可以对某段或几段进行反转再相加,然后再取地址。
           折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况。
1.5除留余数法
此方法为最常用的构造散列函数方法。对于散列表长 为m的散列函数公式为:
        f(key)=key  mod   p(p<=m)
事实上,这方法不仅可以对关键字直接取模,也可以在折叠、平方取中后再取模。
      根据前辈们的经验,通常p为小于或等于表长(最好接近m)的最小质数或不包含小于20质因子的合数。

1.6随机数法
     选择一个随机数,取关键字的随机函数为它的散列地址。也就是f(key)=random(key).这里的 random是随机函数。当关键字的长度不等时,采用这个方法构造散列函数是比较合适的。
      对于关键字是字符串的,其实无论是英文字符,还是中文字符,也包括各种各样的符号,他们都可以转化为某种数字来对待,比如ASCII码或者Unicode码等,因此也就可以使用上面的这些方法。

总之,现实中,应该视不同的情况采用不同的散列函数。给出以下考虑的因素来提供参考:
                        1.计算散列地址所需时间
                        2.关键字长度
3.散列表的大小
4.关键字的分布情况
5.记录查找的频率。综合这些因素,才能决策选择哪种散列函数更适合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息