有序表的查找——折半查找分析

news/2025/2/23 9:08:41

折半查找

  • 一、折半查找的查找过程
    • 1、折半查找(Binary Search)
    • 2、二分查找的基本思想
  • 二、折半查找的实现
  • 三、折半查找的性能分析
  • 四、总结

一、折半查找的查找过程

1、折半查找(Binary Search)

折半查找又称二分查找,它是一种效率较高的查找方法。

二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用数组向量作为表的存储结构,不能使用链表,不妨设有序表是递增有序的。

2、二分查找的基本思想

二分查找的基本思想是:(设R[low…high]是当前的查找区间)

(1)首先确定该区间的中点位置:R[mid]

(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找,具体方法如下:

①若R[mid].key>K,则由表的有序性可知R[mid…n].keys均大于K,因此若表中存在关键字等于K的结点,则该结点必定是在位置mid左边的子表R[1…mid-1]中,故新的查找区间是左子表R[1…mid-1]。

②类似地,若R[mid].key<K,则要查找的K必在mid的右子表R[mid+1…n]中,即新的查找区间是右子表R[mid+1…n]。下一次查找是针对新的查找区间进行的。

因此,从初始的查找区间R[1…n]开始,每经过一次与当前查找区间的中点位置上的结点关键字的比较,就可确定查找是否成功,不成功则当前的查找区间就缩小一半。这一过程重复直至找到关键字为K的结点,或者直至当前的查找区间为空(即查找失败)时为止。
在这里插入图片描述
在这里插入图片描述

二、折半查找的实现


int Search_Bin(StaicTable ST, Elemtype x,int low, int high){
//本函数在递增表ST中进行折半查找,如果查找成功,返回该元素所在位置,否则返回0
   found=false;
   while (low≤high  && !found) 
      {  mid=(low+high) / 2;
         if (x>ST[mid].key)     low=mid+1;
         else if (x<ST[mid].key)  high=mid-1;
         else                   found=true;
      } 
      if (found )  return mid;
      else           
         return 0;
 }

三、折半查找的性能分析

在这里我们先假定要查找的元素数目n恰好构成一棵满二叉树,然后为它加上n+1个外部结点,表示查找不成功的情形。

折半查找的过程可以用下面这样的判定树来模拟:
在这里插入图片描述
该树有m(=2n+1)个结点,高度为 K= log(m+1)=log(n+1)+1。

最坏情形下,就是查找不成功的情形必须要查到叶子结点,查找次数为K次,即log(n+1)+1

要求折半查找的平均情形,我们设落在每个结点的概率均为 1/m, 则总的查找次数为:

11/m + 2(21/m) + 3(41/m) + …… + k(2k-1*1/m)
在这里插入图片描述
而m=2k-1,故A(n)=((k-1)2k+1)/(2k)=(k-1)+1/2k

一般化(即非满二叉树),有:
在这里插入图片描述

四、总结

虽然二分查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlog2n)的时间。

二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。

对那些查找少而又经常需要改动的线性表,可采用链表作存储结构,进行顺序查找。链表上无法实现二分查找。


http://www.niftyadmin.cn/n/1163588.html

相关文章

python做bi系统_python开发bi

广告关闭 腾讯云11.11云上盛惠 &#xff0c;精选热门产品助力上云&#xff0c;云服务器首年88元起&#xff0c;买的越多返的越多&#xff0c;最高返5000元&#xff01; nnversioningn-----nnthis backport is intended to keep 100% compatibilitywith the vanilla release inn…

索引顺序表(分块)查找分析

索引顺序表&#xff08;分块&#xff09;查找一、分块查找表存储结构1、"分块有序"的线性表2、索引表二、分块查找的基本思想三、分块查找示例四、算法分析——平均查找长度ASL索引顺序查找又称分块查找(Blocking Search)。它是一种性能介于顺序查找和二分查找之间的…

python windows服务_Python编写Windows Service服务程序

如果你想用Python开发Windows程序&#xff0c;并让其开机启动等&#xff0c;就必须写成windows的服务程序Windows Service&#xff0c;用Python来做这个事情必须要借助第三方模块pywin32&#xff0c;自己去下载然后安装&#xff08;注意下载符合自己OS的版本&#xff09;。 1.示…

实验三 0-1 背包问题

实验三 0-1 背包问题一. 实验内容二&#xff0e;实验目的三. 算法描述1、动态规划算法描述&#xff1a;2、分支限界法四. 算法实现五&#xff0e;程序运行结果六&#xff0e;实验结果分析七&#xff0e;结论一. 实验内容 分别编程实现动态规划算法和贪心法求 0-1 背包问题的最…

基于python的表情识别_python 优秀项目分享-表情识别

face-classification是B-IT-BOTS robotics team团队基于keras和openCV搭建的人脸识别项目。代码地址在&#xff1a;https://github.com/oarriaga/face_classification 项目在keras上使用fer2013/IMDB数据集进行训练。 IMDB影片任务的性别识别率达到了96%&#xff1b;fer2013的表…

python编写linux巡检脚本_python编写的简单的mysql巡检脚本

report_title\nresultresult.replace(report_title,self.report_title)resultresultself.cpu.__str__()resultresultself.mem.__str__()resultresultself.disk.__str__()resultresultself.mysql.__str__()resultresult

python开源爬虫框架_开源爬虫框架各有什么优缺点?

展开全部 首先爬2113虫框架有三种分布式爬虫&#xff1a;Nutch JAVA单机爬5261虫&#xff1a;Crawler4j&#xff0c;WebMagic&#xff0c;WebCollector 非JAVA单机爬虫&#xff1a;scrapy 第一4102类:分布式爬虫 优点&#xff1a;海量1653URL管理 网速快 缺点&#xff1a;Nutch…

回溯法和分支限界法解决旅行商问题

实验三 旅行商问题一. 实验内容二&#xff0e;实验目的三. 算法描述1、回溯算法描述&#xff1a;2、分支限界法算法描述&#xff1a;四. 算法实现1.数据结构及函数说明&#xff08;1&#xff09; 回溯法求解TSP问题&#xff08;2&#xff09; 分支界限求解TSP问题&#xff1a;2…