1、Hash 算法分析,湖大龙凤婷,2012.9.16,Contents,Hash?,某个东西,某种形式的一个确定结果,什么是哈希表?,Hashtable,根据关键码值直接进行访问的数据结构,为什么使用哈希表?,Y,N,Y,N,哈希表的缺点,1、使元素丧失了有序性 2、元素不能够紧密的排列,需要足够大的空间 3、两个或多个不同项被散列到同一位置是不可避免的冲突,冲突,对不同的关键字可能得到同一散列地址 即key1key2,而f(key1)=f(key2),常用的构造哈希函数的方法,1.直接寻址法 2.数字分析法 3.平方取中法 4.叠加法 5.随机数法 6.除留余数法,常用的构造哈希函数的方法,1
2、. 直接寻址法:取关键字或关键字的某个线性函数值为散列地址即H(key)=key或H(key) = akey + ba和b为常数适合于: 地址集合的大小 = 关键字集合的大小,常用的构造哈希函数的方法,有一组关键码如下: 942148, 941269, 940527, 941630, 941805, 941558, 942047, 940001 散列函数:Hash (key) = key - 940000 Hash (942148) = 2148 Hash (941269) = 1269Hash (940527) = 527 Hash (941630) = 1630Hash (941805)
3、= 1805 Hash (941558) = 1558Hash (942047) = 2047 Hash (940001) = 1,常用的构造哈希函数的方法,2. 数字分析法:选择其中数字分布比较均匀的若干位,所组成的新的值作为关键字或者直接作为函数值。,常用的构造哈希函数的方法,3.平方取中法:取关键字平方后的中间几位为哈希地址。12321 12345 15682 151807041 152399025 245925124,常用的构造哈希函数的方法,4.叠加法:将关键字分割成位数相同的几部分,然后取这几部分的叠加和(舍去进位)作为哈希地址。移位法 把各部分的最后一位对齐相加;分界法 各部分不
4、折断,沿各部分的分界来回折叠, 然后对齐相加,将相加的结果当做散列地址。适合于: 关键字的数字位数特别多,常用的构造哈希函数的方法,关键码为 key = 23938587841 若存储空间限定 3 位, 则划分结果为每段 3 位. 可将上述关键码可划分为 4段:,常用的构造哈希函数的方法,5.随机数法:设定哈希函数为:H(key) = Random(key)其中,Random 为伪随机函数适用于对长度不等的关键字构造哈希函数,常用的构造哈希函数的方法,6. 除留余数法:取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址即 H(key) = key MOD p (p=m)给定一组关键
5、字为: 12, 39, 18, 24, 33, 21 H(key) = key MOD 9 3 3 0 6 6 3这里对P要有什么限制条件么?,常用的构造哈希函数的方法,12, 39, 18, 24, 33, 21若取 p=9, 则他们对应的哈希函数值将为: 3, 3, 0, 6, 6, 3若取 P=18,则他们对应的哈希函数值将为12,3,0,6,15,3若取p=24,则他们将对应的哈希函数值将为:12,15,18,0,9,21一般结论:选取的P较小,“冲突”的可能性较大,处理冲突的方法,1.拉链法 拉出一个动态链表代替静态顺序存储结构 但链表的设计过于麻烦,增加了编程复杂度 可以完全避免哈希函数的冲突2.多哈希法 设计二种甚至多种哈希函数 函数设计的越好或越多可以将几率降到最低,处理冲突的方法,3.开放地址法 公式:Hi=(H(key)+di) MOD m i=1,2,.,k(k=m-1) m为哈希表的表长 di 是产生冲突的时候的增量序列 如果di值可能为1,2,3,.m-1,称线性探测再散列 如果di取值可能为1,-1,2,-2,4,-4,9,-9,16,-16,.k*k,-k*k(k=m/2)称二次探测再散列 如果di取值可能为伪随机数列,称伪随机探测再散列4.建域法建立一个公共溢出区用以存储发生冲突的记录,几种简单的哈希算法,Thank You !,