哈希表的一些知识

1.开放定址法
   Hi=(H(key)+di) mod  m  i=1,2,……,k(k≤m-1)
   其中:H(key)为哈希函数;m为哈希表表长;di为增量序列,有三种取法。
di=1,2,……,m-1;称为线性探测再散列或线性探查法。
di=12,-12,22,-22,32,……,±k2,(k≤m/2);称为二次探测再散列
di=伪随机数序列,称为伪随机探测再散列

2.再哈希法
    Hi=RHi(key)     i=1,2,……,k
    RHi均是不同的哈希函数,即在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生。这种方法不易产生聚集,但增加了计算的时间。

3.链地址法(结合的同义词子表)

    把具有相同散列地址的关键字存放在同一个链表中,称为同义词表。同时用数组 T存放各个链表的头指针。
凡是散列地址为i的记录都以结点方式插入到以T[i]为头指针的单链表中。

4. 建立一个公共的溢出区(分离的同义词子表)
    假设哈希函数的值域为
[0、、m-1],则设向量HashTable[0、、m-1]为基本表,每个分量存放一个记录,另
设立向量OverTable[0、、v]为溢出表。所有关键字和基本表中关键字为同义词的记录,不管它们由哈希函数得
到的哈希地址是什么,一旦发生冲突,都填入溢出表。
PS. 什么是哈希表?
哈希函数 假设 F是一个包含n个记录的文件空间,Ri为文件中的某个记录(1≤i≤n),keyi是其关键字值,若存在关 键字值keyi与记录Ri的地址之间建立某种函数关系,则便可以通过这个函数把关键字值转换成相应记录在文件中的地址。即有:addr(Ri)=H(keyi),其中addr(Ri)为Ri的地址,H(keyi)称为哈希函数。

哈希表 通过哈希函数构造而成的表称为哈希表。

把记录按地址存放到文件空间中相应的位置上,就形成了哈希表,也称散列表,构成哈希表的构成称为地址散列。

冲突 若某个散列函数对于不同的关键字 key1和key2,得到相同的散列地址,这种现象称为冲突,这两个关键字称为 同义词。

解决冲突即为对应到同一地址的多个同义词安排存储位置。因此在选定散列函数是应该考虑尽量避免发生冲突,也就是说,一个好的散列函数应能将关键字值均匀地分布在整个地址空间中,是产生冲突的机会尽量少。但冲突是不可避免的,所以构造哈希表应包括选定均匀的散列函数,以及解决冲突的方法。
哈希函数的构造方法
1.直接地址法
     取关键字或关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a·key+b

2.数字分析法

    假设关键字是以R为基的数(如2,8,10等),并且哈希表中可能出现的关键字都是事先知道的,则可以取关键字的若干数位来组成哈希地址。
例如:有80个记录,关键字为8位10进制数,则可取其中两位数作为哈希地址。
              813 46 532       ①取中间4位中的任意两位。
              813 72 242       ②取其中两位于另外两位的叠加和。
              813 87 422
              813 01 367
              813 22 817
              ┆ ┆ ┆┆

3.平方取中法

   有时一组关键字在每一位上某些数字的重复出现频率很高,例如:(
该方法适用于关键字位数少而相同的位数多的关键字。

4.折叠法(边界法)与转移法

    有时关键字含位数较多,这时可将关键字值从某些地方断开,分成几段,其中一段的长度等于地址的位数,把其余折叠加到它的上面,若产生进位则舍去。
0100,1100,1200,1160,2060,2163,2261,2262),这时无法是用数字分析法得到较均匀的哈希函数,平方取中法是首先求关键字的平方值,通过平方来扩大差别,然后再选其中的几位或其组合作为哈希地址。


5.除留余数法

     取关键字被某个不大于哈希表表长m的数p除后所得的余数作为哈希地址。即:H(key)=key MOD p  (p≤m 一般取p为不大于m的最大素数。)

6.随机数法

     选择一随机函数,取关键字的随机函数值作为它的哈希地址。即:H(key)=random(key)当关键字长度不相等时,可以采用此方法。

选取哈希函数时需要考虑的因素:

计算哈希地址所需要的时间
关键字的长度
哈希表的大小
关键字的分布情况
记录的查找频率
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值