知识大全 查找 - 散列技术 - 处理冲突的方法(二)

Posted 结点

篇首语:学向勤中得,萤窗万卷书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 查找 - 散列技术 - 处理冲突的方法(二)相关的知识,希望对你有一定的参考价值。

  利用线性探测法构造散列表

  【例 】已知一组关键字为( ) 用除余法构造散列函数 用线性探查法解决冲突构

  造这组关键字的散列表

  解答:为了减少冲突 通常令装填因子α

  数为:h(key)=key%13。

  由除余法的散列函数计算出的上述关键字序列的散列地址为(0,10,2,12,5,2,3,12,6,12)。

  前5个关键字插入时,其相应的地址均为开放地址,故将它们直接插入T[0],T[10),T[2],T[12]和T[5]中。

  当插入第6个关键字15时,其散列地址2(即h(15)=15%13=2)已被关键字41(15和41互为同义词)占用。故探查h1=(2+1)%13=3,

  此地址开放,所以将15放入T[3]中。

  当插入第7个关键字68时,其散列地址3已被非同义词15先占用,故将其插入到T[4]中。

  当插入第8个关键字12时,散列地址12已被同义词38占用,故探查hl=(12+1)%13=0,而T[0]亦被26占用,再探查h2=(12+2)%

  13=1,此地址开放,可将12插入其中。

  类似地,第9个关键字06直接插入T[6]中;而最后一个关键字51插人时,因探查的地址12,0,1,…,6均非空,故51插入

  T[7]中。

  构造散列表的具体过程【 参见动画演示 】

  聚集或堆积现象

  用线性探查法解决冲突时,当表中i,i+1,…,i+k的位置上已有结点时,一个散列地址为i,i+1,…,i+k+1的结点都将插入在

  位置i+k+1上。把这种散列地址不同的结点争夺同一个后继散列地址的现象称为聚集或堆积(Clustering)。这将造成不是同义词的结

  点也处在同一个探查序列之中,从而增加了探查序列的长度,即增加了查找时间。若散列函数不好或装填因子过大,都会使堆积现象

  加剧。

  【例】上例中,h(15)=2,h(68)=3,即15和68不是同义词。但由于处理15和同义词41的冲突时,15抢先占用了T[3],这就使

  得插入68时,这两个本来不应该发生冲突的非同义词之间也会发生冲突。

  为了减少堆积的发生,不能像线性探查法那样探查一个顺序的地址序列(相当于顺序查找),而应使探查序列跳跃式地散列在整个

  散列表中。

  ②二次探查法(Quadratic Probing)

  二次探查法的探查序列是:

  h i =(h(key)+i*i)%m 0≤i≤m-1 //即d i =i 2

  即探查序列为d=h(key),d+1 2 ,d+2 2 ,…,等。

  该方法的缺陷是不易探查到整个散列空间。

  ③双重散列法(Double Hashing)

  该方法是开放定址法中最好的方法之一,它的探查序列是:

  h i =(h(key)+i*h1(key))%m 0≤i≤m-1 //即d i =i*h1(key)

  即探查序列为:

  d=h(key),(d+h1(key))%m,(d+2h1(key))%m,…,等。

  该方法使用了两个散列函数h(key)和h1(key),故也称为双散列函数探查法。

  注意:

  定义h1(key)的方法较多,但无论采用什么方法定义,都必须使h1(key)的值和m互素,才能使发生冲突的同义词地址均匀地分布

  在整个表中,否则可能造成同义词地址的循环计算。

  【例】 若m为素数,则h1(key)取1到m-1之间的任何数均与m互素,因此,我们可以简单地将它定义为:

  h1(key)=key%(m-2)+1

  【例】对例9.1,我们可取h(key)=key%13,而h1(key)=key%11+1。

  【例】若m是2的方幂,则h1(key)可取1到m-1之间的任何奇数。

  2、拉链法

  (1)拉链法解决冲突的方法

  拉链法解决冲突的做法是:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为

  一个由m个头指针组成的指针数组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均

  应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。

  【例9.2】已知一组关键字和选定的散列函数和例9.1相同,用拉链法解决冲突构造这组关键字的散列表。

  解答:不妨和例9.1类似,取表长为13,故散列函数为h(key)=key%13,散列表为T[0..12]。

  注意:

  当把h(key)=i的关键字插入第i个单链表时,既可插入在链表的头上,也可以插在链表的尾上。这是因为必须确定key不在第i个

  链表时,才能将它插入表中,所以也就知道链尾结点的地址。若采用将新关键字插入链尾的方式,依次把给定的这组关键字插入表中

  ,则所得到的散列表

  具体构造过程【 参见动画演示 】。

  

>

  (2)拉链法的优点

  与开放定址法相比,拉链法有如下几个优点:

  (1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;

  (2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;

  (3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大

  时,拉链法中增加的指针域可忽略不计,因此节省空间;

  (4)在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散

  列表,删除结点不能简单地将被删结点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放

  地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点

  上做删除标记,而不能真正删除结点。

  (3)拉链法的缺点

  拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列

  表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。

cha138/Article/program/sjjg/201311/23677

相关参考

知识大全 查找 - 散列技术 - 散列表的概念

  散列方法不同于顺序查找二分查找二叉排序树及B树上的查找它不以关键字的比较为基本操作采用直接寻址技术在理想情况下无须任何比较就可以找到待查关键字查找的期望时间为O()  散列表的概念  散列表  设

知识大全 第9章查找(二)习题练习

设散列表长度为散列函数h(x)=x%给定的关键字序列为试画出分别用拉链法和线性探查法解决冲突时所构造的散列表并求出在等概率情况下这两种方法查找成功和失败时的平均查找长度请问装填因子的值是什么?&nbs

知识大全 第9章查找(二)习题练习答案

设散列表长度为散列函数h(x)=x%给定的关键字序列为试画出分别用拉链法和线性探查法解决冲突时所构造的散列表并求出在等概率情况下这两种方法查找成功和失败时的平均查找长度请问装填因子的值是什么?&nbs

知识大全 查找 - 散列技术 - 散列函数的构造方法

  散列函数的构造方法  散列函数的选择有两条标准简单和均匀  简单指散列函数的计算简单快速;  均匀指对于关键字集合中的任一关键字散列函数能以等概率将其映射到表空间的任何一个位置上也就是说散列函数能

知识大全 第五部分 查找[5]

   (五)散列(Hash)表    定义    哈希函数类似于数学中定义的函数每个值都能通过哈希函数算出对应值的  哈希表根据设定的哈希函数和处理冲突的方法将一组关键字

知识大全 第五部分 查找[6]

   二次探测法  当发生冲突时寻找下一个散列地址的公式为  Hi=(H(key)+di)%m  (di=--…q-q且q≤m/)    随机探测法  当发生冲突时下一个

知识大全 数据结构考研分类复习真题 第九章 集合[49]

  设给定关键字输入序列为()用散列法散列的地址区间要求设计一合理的散列函数;冲突时用链表法解决写出散列算法并构造出散列表在等概率查找情况下查找成功的平均查找长度是多少?【东北大学 四(分)

知识大全 查找 - 散列技术 - 散列表上的运算

  散列表上的运算  散列表上的运算有查找插入和删除其中主要是查找这是因为散列表的目的主要是用于快速查找且插入和删除均要用到查  找操作  散列表类型说明  #defineNIL//空结点标记依赖于关

知识大全 文件 - 散列文件

  散列文件的组织方式  散列文件是利用散列存储方式组织的文件亦称直接存取文件即根据文件中关键字的特点设计一个散列函数和处理冲突的方  法将记录散列到存储设备上  散列表与散列文件比较  >  基桶和

知识大全 数据结构考研分类复习真题 第九章 集合[24]

  对下面的关键字集若查找表的装填因子为采用线性探测再散列方法解决冲突做  ()设计哈希函数; ()画出哈希表;  ()计算查找成功和查找失败的平均查找长度;()写出将哈希表中某个数据元素删