散列表查找(哈希表)

相关散列表只是总结

存储位置 = f(关键字)
那样我们可以通过查找关键字不需要比较就可获得需要的记录的存储位置。这就是一种新的存储技术----散列技术。
散列技术是在记录的存储位置和他的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。
这里我们把这种对应关系f称为散列函数,又称哈希函数。按这个思想,采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表。

散列过程分为两步:
1、在存储时,通过散列函数计算记录的散列地址,并按照散列地址存储该记录。
2、在查找时,通过散列函数计算记录的散列地址,按此散列地址访问该记录。
所以说散列技术是一种存储方法,也是一种查找方法。
散列技术最合适的求解问题是查找与给定值相等的记录。

好的散列函数:1.计算简单 2.散列地址分布均匀。

散列函数的构造方法
1、直接定址法
取关键字的某个线性函数值为散列地址,即f(key) = a*key+b;
这样的散列函数有点就是简单、均匀,也不会产生冲突,但问题是这需要事先知道关键字的分布情况,适合查找表较小且连续的情况。
2、数字分析法
抽取方法是使用关键字的一部分来计算散列存储位置的方法,
数字分析法通常适合处理关键字位数比较大的情况,如果事先知道关键字的分布且关键字的若干分布较均匀,就可以考虑用此方法。
3、平方取中发
关键字是数字的,把它平方,抽取中间三位用作散列地址。
此方法适合不知道关键字的分布,而位数又不是很大的情况。
4、折叠法
折叠法就是将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够可短些),然后将这几部分叠加求和,并按照散列表表长,取后几位作为散列地址。
折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况。
5、除留余数法
f(key)=key % p(p<=m )
若列表表长为m,通常p为小于或等于表长的最小质数或不包含小于20质因子的合数。
6、随机数法
选择一个随机数,取关键字的随机函数值为它的散列地址。f(key)=random(key)

处理散列冲突的方法
1、开发定址法
所谓开放定制法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。
fi(key) = (f(key) + di) MOD m (di = 0,1,2,..................m-1)
我们把这种解决冲突的开放定址法称为线性探测法。
我们在解决冲突的时候,会碰到本来都不是同义词的却需要争夺一个地址的情况,称这种现象为堆积。
另外增加平方运算的目的是为了不让关键字都聚集在某一块区域,我们称这种方法为二次探测法。
fi(key) = (f(key) + di) mod m (di = 12,-12,22,-22.............q2,-q2);
还有一种方法是在冲突时,分地域位移量di采用随机函数得到,我们称为随机探测法。
fi(key) = (f(key) + di) MOD m (di =随机数)
2、再散列函数法
fi(key) = RHi(key) (i=1,2,3,..........,k)
RHi就是不同的散列函数
3、链地址法

具体的关键字列表为(19,14,23,01,68,20,84,27,55,11,10,79),则哈希函数为H(key)=key MOD 13。则采用除留余数法和链地址法后得到的预想结果应该为:


4、公共溢出区法

为所有冲突的关键字记录建立一个公共的溢出区来存放。在查找时,对给定关键字通过散列函数计算出散列地址后,先与基本表的相应位置进行比对,如果相 等,则查找成功;如果不相等,则到溢出表进行顺序查找。如果相对于基本表而言,在有冲突的数据很少的情况下,公共溢出区的结构对查找性能来说还是非常高 的。

 




猜你喜欢

转载自blog.csdn.net/wyq024613/article/details/51274279
今日推荐