www.78984.com

您的当前位置: www.5542.com > www.78984.com >

只思量查找顺利的环境

发布日期:2019-10-05 来源:未知 点击:

  int block_search(int key, int a[]) /*自定义实现分块查找*/

  分块查找要求把一个大的线性表分化成若干块,每块中的节点能够肆意存放,但块取块之间必需排序。假设是按环节码值非递减的,那么这种块取块之间必需满脚已排序要求,现实上就是对于肆意的i,第i块中的所有节点的环节码值都必需小于第i+1块中的所有节点的环节码值。此外,还要成立一个索引表,把每块中的最大环节码值做为索引表的环节码值,按块的挨次存放到一个辅帮数组中,明显这个辅帮数组是按环节码值费递减排序的。查找时,起首正在索引表中进行查找,确定要找的节点所正在的块。因为索引表是排序的,因而,对索引表的查找能够采用挨次查找或折半查找;然后,正在响应的块中采用挨次查找,即可找到对应的节点。

  index_table[i].start = j + 1; /*确定每个块范畴的起始值*/

  分块查找是折半查找和挨次查找的一种改良方式,折半查找虽然具有很好的机能,但其前提前提时线性表挨次存储并且按照环节码排序,这一前提前提正在结点树很大且表元素动态变化时是难以满脚的。而挨次查找能够处理表元素动态变化的要求,但查找效率很低。若是既要连结对线性表的查找具有较快的速度,又要可以或许满脚表元素动态变化的要求,则可采用分块查找的方式。

  声明:百科词条人人可编纂,词条建立和点窜均免费,毫不存正在及代办署理商付费代编,请勿上当。详情

  index_table[i].key = a[j]; /*确定每个块范畴中元素的最大值*/

  分块查找的平均查找长度由两部门构成,一个是对索引表进行查找的平均查找长度,一个是对快内节点进行查找的平均查找长度,总的平均查找长度为E(n)=+。线性表有n个节点,分成大小相等的b块,每块有s=n/b个节点。假定读索引表也采用挨次查找,只考虑查找成功的环境,并假定对每个节点的查找概率是相等的,则对每块的查找概率是1/b,对快内每个节点的查找概率是1/s。如图

  分块查找的速度虽然不如折半查找算法,但比挨次查找算法快得多,同时又不需要对全数节点进行排序。当节点良多且块数很大时,对索引表能够采用折半查找,如许可以或许进一步提高查找的速度。

  if (j index_table[i].end) /*若是大于块范畴的竣事值,则申明没有要查找的数,j置0*/

  printf(no found!); /*若未找到则输出提醒消息*/

  分块查找因为只需求索引表是有序的,对块内节点没有排序要求,因而出格适合于节点动态变化的环境。当添加或削减节以及节点的环节码改变时,只需将该节点调整到所正在的块即可。正在空间复杂性上,分块查找的次要价格是添加了一个辅帮数组。

  while (i = 3 && key index_table[i].key) /*确定正在阿谁块中*/

  printf(please input the number which do you want to search:\n);

  printf(success.the position is :%d\n, k); /*若是找到该数,则输出其*/

  需要留意的是,当节点变化很屡次时,可能会导致块取块之间的节点数相差很大,没写快具有良多节点,而另一些块则可能只要很少节点,这将会导致查找效率的下降。

  printf(please input the number:\n);

  scanf(%d, /*输入由小到大的15个数*/

  分块查找正在现实糊口中也很常用。例如,一个学校有良多个班级,每个班级有几十个学生。给定一个学生的学号,要求查找这个学生的相关材料。明显,每个班级的学生档案是分隔存放的,没有任何两个班级的学生的学号是交叉堆叠的,那么最好的查找方式实现确定这个学生所正在的班级,然后再正在这个学生所正在班级的学生档案中查找这个学生的材料。上述查找学生材料的过程,现实上就是一个典型的分块查找。

  while (j = index_table[i].end && a[j] != key) /*正在确定的块内进行查找*/

  分块查找是折半查找挨次查找的一种改良方式,分块查找因为只需求索引表是有序的,对块内节点没有排序要求,因而出格适合于节点动态变化的环境。