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

Posted 结点

篇首语:得意犹堪夸世俗,诏黄新湿字如鸦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 查找 - 散列技术 - 散列表上的运算相关的知识,希望对你有一定的参考价值。

  散列表上的运算

  散列表上的运算有查找 插入和删除 其中主要是查找 这是因为散列表的目的主要是用于快速查找 且插入和删除均要用到查

  找操作

   散列表类型说明

  #define NIL //空结点标记依赖于关键字类型 本节假定关键字均为非负整数

  #define M //表长度依赖于应用 但一般应根据 确定m为一素数

  typedef struct //散列表结点类型

  KeyType key;

  InfoType otherinfo; //此类依赖于应用

  NodeType;

  typedef NodeType HashTable[m]; //散列表类型

   基于开放地址法的查找算法

  散列表的查找过程和建表过程相似 假设给定的值为K 根据建表时设定的散列函数h 计算出散列地址h(K) 若表中该地址单元

  为空 则查找失败;否则将该地址中的结点与给定值K比较 若相等则查找成功 否则按建表时设定的处理冲突的方法找下一个地址

   如此反复下去 直到某个地址单元为空(查找失败)或者关键字比较相等(查找成功)为止

  ( )开放地址法一般形式的函数表示

  int Hash(KeyType k int i)

   //求在散列表T[ m ]中第i次探查的散列地址hi ≤i≤m

  //下面的h是散列函数 Increment是求增量序列的函数 它依赖于解决冲突的方法

  return(h(K)+Increment(i))%m; //Increment(i)相当于是d i

  

  若散列函数用除余法构造 并假设使用线性探查的开放定址法处理冲突 则上述函数中的h(K)和Increment(i)可定义为

  int h(KeyType K) //用除余法求K的散列地址

  return K%m;

  

  int Increment(int i)//用线性探查法求第i个增量d i

  return i; //若用二次探查法 则返回i*i

  

  ( )通用的开放定址法的散列表查找算法

  int HashSearch(HashTable T KeyType K int *pos)

   //在散列表T[ m ]中查找K 成功时返回 失败有两种情况 找到一个开放地址

  //时返回 表满未找到时返回 *pos记录找到K或找到空结点时表中的位置

  int i= ; //记录探查次数

  do

  *pos=Hash(K i); //求探查地址hi

  if(T[*pos] key==K) return l; //查找成功返回

  if(T[*pos] key==NIL) return ;//查找到空结点返回

  while(++i

  return -1; //表满且未找到时,查找失败

   //HashSearch

  注意:

  上述算法适用于任何开放定址法,只要给出函数Hash中的散列函数h(K)和增量函数Increment(i)即可。Tw.wiNGWit.Com但要提高查找效率时,

  可将确定的散列函数和求增量的方法直接写入算法HashSearch中,相应的算法【参见习题】。

  3、基于开放地址法的插入及建表

  建表时首先要将表中各结点的关键字清空,使其地址为开放的;然后调用插入算法将给定的关键字序列依次插入表中。

  插入算法首先调用查找算法,若在表中找到待插入的关键字或表已满,则插入失败;若在表中找到一个开放地址,则将待插入的

  结点插入其中,即插入成功。

  void Hashlnsert(HashTable T,NodeTypene w)

   //将新结点new插入散列表T[0..m-1]中

  int pos,sign;

  sign=HashSearch(T,new.key,&pos); //在表T中查找new的插入位置

  if(!sign) //找到一个开放的地址pos

  T[pos]=new; //插入新结点new,插入成功

  else //插人失败

  if(sign>0)

  printf("duplicate key!"); //重复的关键字

  else //sign<0

  Error("hashtableoverflow!"); //表满错误,终止程序执行

   //Hashlnsert

  void CreateHashTable(HashTable T,NodeType A[],int n)

   //根据A[0..n-1]中结点建立散列表T[0..m-1]

  int i

  if(n>m) //用开放定址法处理冲突时,装填因子α须不大于1

  Error("Load factor>1");

  for(i=0;i

  T[i].key=NIL; //将各关键字清空,使地址i为开放地址

  for(i=0;i

  Hashlnsert(T,A[i]);

   //CreateHashTable

  4、删除

  基于开放定址法的散列表不宜执行散列表的删除操作。若必须在散列表中删除结点,则不能将被删结点的关键字置为NIL,而应该

  将其置为特定的标记DELETED。

  因此须对查找操作做相应的修改,使之探查到此标记时继续探查下去。同时也要修改插人操作,使其探查到DELETED标记时,将

  相应的表单元视为一个空单元,将新结点插入其中。这样做无疑增加了时间开销,并且查找时间不再依赖于装填因子。

  因此,当必须对散列表做删除结点的操作时,一般是用拉链法来解决冲突。

  注意:

  用拉链法处理冲突时的有关散列表上的算法【参见练习】。

  5、性能分析

  插入和删除的时间均取决于查找,故下面只分析查找操作的时间性能。

  虽然散列表在关键字和存储位置之间建立了对应关系,理想情况是无须关键字的比较就可找到待查关键字。但是由于冲突的存在

  ,散列表的查找过程仍是一个和关键字比较的过程,不过散列表的平均查找长度比顺序查找、二分查找等完全依赖于关键字比较的查

  找要小得多。

  (1)查找成功的ASL

  散列表上的查找优于顺序查找和二分查找。

  【例】在例9.1和例9.2的散列表中,在结点的查找概率相等的假设下,线性探查法和拉链法查找成功的平均查找长度分别为:

  ASL=(1×6+2×2+3×l+9×1)/10=2.2 //线性探查法

  ASL=(1×7+2×2+3×1)/10=1.4 //拉链法

  而当n=10时,顺序查找和二分查找的平均查找长度(成功时)分别为:

  ASL=(10+1)/2=5.5 //顺序查找

  ASL=(1×l+2×2+3×4+4×3)/10=2.9 //二分查找,可由判定树求出该值

  (2) 查找不成功的ASL

  对于不成功的查找,顺序查找和二分查找所需进行的关键字比较次数仅取决于表长,而散列查找所需进行的关键字比较次数和待

  查结点有关。因此,在等概率情况下,也可将散列表在查找不成功时的平均查找长度,定义为查找不成功时对关键字需要执行的平均

  比较次数。

  【例】例9.1和例9.2的散列表中,在等概率情况下,查找不成功时的线性探查法和拉链法的平均查找长度分别为:

  ASL unsucc =(9+8+7+6+5+4+3+2+1+1+2+1+10)/13=59/13≈4.54

  ASL unsucc =(1+0+2+1+0+1+1+0+0+0+1+0+3)/13≈10/13≈0.77

  注意:

  ①由同一个散列函数、不同的解决冲突方法构造的散列表,其平均查找长度是不相同的。

  ②散列表的平均查找长度不是结点个数n的函数,而是装填因子α的函数。因此在设计散列表时可选择α以控制散列表的平均查找

  长度。

  ③ α的取值

  α越小,产生冲突的机会就小,但α过小,空间的浪费就过多。只要α选择合适,散列表上的平均查找长度就是一个常数,即散

  列表上查找的平均时间为O(1)。

  ④ 散列法与其他查找方法的区别

  除散列法外,其他查找方法有共同特征为:均是建立在比较关键字的基础上。其中顺序查找是对无序集合的查找,每次关键字的比较

  结果为"="或"!="两种可能,其平均时间为O(n);其余的查找均是对有序集合的查找,每次关键字的比较有"="、"<"和">"三种可能

  ,且每次比较后均能缩小下次的查找范围,故查找速度更快,其平均时间为O(lgn)。而散列法是根据关键字直接求出地址的查找方法

  ,其查找的期望时间为O(1)。

cha138/Article/program/sjjg/201311/23675

相关参考

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

  利用线性探测法构造散列表  【例】已知一组关键字为()用除余法构造散列函数用线性探查法解决冲突构  造这组关键字的散列表  解答:为了减少冲突通常令装填因子α  数为:h(key)=key%13。

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

  处理冲突的方法  通常有两类方法处理冲突开放定址(OpenAddressing)法和拉链(Chaining)法前者是将所有结点均存放在散列表T[m  ]中;后者通常是将互为同义词的结点链成一个单链

知识大全 数据结构[4]

  查找  在给定的数据集合中查找某个关键值就是查找查找的基本方法主要有顺序查找法折半查找法B树散列(Hash)表及其查找考的比较多的是折半查找和散列表我们要掌握它们的基本概念和方法例如散列表的碰撞如

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

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

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

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

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

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

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

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

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

  设散列函数为H(K)=KMOD解决冲突的方法为链接法试将下列关键字集合依次插入到散列表中(画出散列表的示意图)并计算平均查找长度ASL【首都经贸大学三(分)】  已知散列表的地址空间为A[]散列函

知识大全 文件 - 散列文件

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

知识大全 09年自考《数据结构》各章要点二[10]

  散列技术将结点按其关键字的散列地址存储到散列表的过程称为散列  散列函数的选择有两条标准简单和均匀  常见的散列函数构的造方法  ·平方取中法hash=int((x^)%)  ·除余法表长为mha