哈希表

来源:互联网 发布:动漫头像软件下载 编辑:程序博客网 时间:2024/06/06 17:53
    线性表、树中,记录在结构中的 相对位置是随机的,和记录的关键字之间不存在确定的关系。因此,查找的过程需要进行一系列和关键字的比较。查找的效率依赖于查找过程中所进行的比较次数。
    希望的理想情况:不经过任何的比较,一次存取便能得到所查记录。必须在记录的存储位置关键字之间建立一种一个确定的关系f, 使得每个关键字和结构中的一个唯一的存储位置相对应。只要根据对应关系f 就能找到给定K的像f(K), 若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上。 也即关键字(K)和 存储位置 f(K) 一一对应。
   称对应关系 f 为哈希函数,按这个思想建立的表为 哈希表 。
    哈希函数是一个映像,其设定非常灵活,只要使得任何关键字由此所得的哈希函数值都落在表长的范围值内即可。
   对不同的关键字可能得到同一哈希地址,即key1 != key2 , 而 f(key1) == f(key2) ,这种现象称为冲突。

  哈希表的相对准确描述: 根据设定的哈希函数H(KEY)处理冲突的方法 将一组关键字映像到一个有限的连续地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中存储位置,这种表便为哈希表。

哈希函数的构造方法:
1、直接定址法
     取关键字或关键字的某个线性函数值为哈希地址。即  H(KEY) =  KEY 或  H(KEY) = a*KEY+b; 
2、数字分析法
    假设关键字是以r 为基的数(如:以10 为基的十进制数),并且哈希表中可能出现的关键字都是事先知道的,则可取关键字的若干数位组成哈希地址。
3、平方取中法
     取关键字平方后的中间几位为哈希地址。
4、折叠法
    将关键字分隔成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这种方法叫做折叠法。 适用于 关键字位数很多,而且关键字中每一位上数字分布大致均匀时。
5、除留余数法
     取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址。 H(KEY) = KEY mod  p , p <= m
6、随机数法
    
处理冲突的方法:
1、开放地址法
    H(i) = (H(KEY)+di) mod m  ,  i = 1,2,3, ……,k (<=m-1)
di 为增量序列,有下列3种取法:
   (1)di = 1,2,3……m-1 , 称 线性探测再散列 ; (2) di = 1^2, -1^2, 2^2, -2^2, …… +(-)k^2, (k <= m/2) 称二次探测再散列,(3)di=伪随机数序列,称为随机探测再散列.
    (2) 再哈希法  H(i)= RHi(key);
   (3)链地址法  将所有关键字为同义词的记录存储在同一线性链表中
    (4) 建立一个公共溢出区


               

    
0 0
原创粉丝点击