折半查找又叫二分查找,是数据结构中一种很重要的查找方式。

其特点有以下几个:

  1. 只能对有序的顺序表进行查找。
  2. 是一种静态查找。
  3. 查找的平均时间复杂度为o(log2n)。
  4. 成功平均查找长度ASL约log2(n+1)-1。

这里要注意折半查找和二叉排序树查找的区别。折半查找和二叉排序树查找的平均查找长度均取决于树高h(或折半查找判定树的高h),折半查找的判定树的高只与序列长度n相关(必为平衡二叉树AVL树),而二叉排序树查找构建二叉排序树时树的高度还取决于序列顺序。所以折半判定树树高始终为log2(n+1)向上取整,而在最优情况下二叉排序树树高最低为log2(n+1)向上取整,最坏情况下(序列有序)树高h为n;因此折半查找最多比较次数为log2(n+1)向上取整,而二叉排序树最优情况下与此相等,最坏情况下为n次。

以下给出一个折半查找的C++代码:

  1. #define MaxSize 50;
  2. using namespace std;
  3. struct SeqList{
  4. Elemtype elem[MaxSize];
  5. int Length;
  6. };
  7. int Binary_Search(SeqList L,Elemtype x)
  8. {
  9. int low=0,high=L.Length-1,mid;
  10. while(low<=high)
  11. {
  12. mid=(low+high)/2;
  13. if(x==L.elem[mid])
  14. return mid;
  15. else if(x<L.elem[mid])
  16. high=mid-1;
  17. else
  18. low=mid+1;
  19. }
  20. return -1;
  21. }

可以看出折半查找的代码相对非常简单。在实际的考题中,往往会出现对具体个数的序列的折半查找等概率下的成功查找长度和失败查找长度,解决这类问题需要画出对应的二叉判定树。有时甚至会出现直接对于某二叉判定树的问题(如某具体序列中查找某元素的比较顺序或某序列的最大比较次数等问题)。

以下给出我在学习中总结的一种比较简便的构造折半二叉判定树的思路以及方法:

思路分析:

在计算mid值时,使用的时mid=(low+high)/2  。这里由于mid为int类型,自动默认为向下取整,因此对于一个长度为n序列进行划分之后的序列为 (0,1,2,……,mid-1)mid(mid+1,mid+2,……n-1),此时出现两种情况:

  • 左子序列长==右子序列长      (n=2k+1    k=0,1,2,……)
  • 左子序列长==右子序列长-1   (n=2k        k=1,2,3,……)

因此可以得知,折半查找的二叉判定树对于所有结点,左子树结点个数<=右子树结点个数。即:

  1. 若某序列总长n为奇数,左右子树结点个数相等;
  2. 若某序列总长n为偶数,左字数结点个数=右子树结点个数-1.

由此给定某个序列,构建折半查找判定树方法如下三步:

  1. 按照二叉树每层最大结点数为2^(h-1)依次由上至下构建满二叉树至最底层不够形成满二叉树为止。
  2. 将剩余结点按照上述粉字的规律依次填入最底层即为二叉判定树的树形。
  3. 按照中序遍历顺序将各结点值填入结点即可。

具体如下面的例子:

例:画出(2,5,7,10,14,15,18,23,35,41,52)的折半查找判定树。

1.序列总长度为n=11>2^3-1=7     即二叉判定树为4层,第4层不满。

2.

1)剩余四个结点。当第四层一个叶结点时,结点总数n=8为偶数,因此对于a来说,应加在a的右子树,即c的子树中;对于c来说,结点总数n=4为偶数,应加在c的右子树中,即g的子树中;对于g来说,结点总数n=2为偶数,应加在g的右子树,即

2)在第四层加入第二个结点时,结点总数n=9为奇数,因此对于a来说,应加在a的左子树使左右子树结点个数相等,即加在b的子树中;对于b来说,结点总数n=4为偶数,应加在b的右子树,即e的子树中;对于e来说,结点总数n=2为偶数,应加在e的右子树,即

3)同理分析,第三个结点应加在a的右孩子的左孩子的右子树,即

4)第四个结点加在a的左孩子的左孩子的右子树,即

得到最终的树形如上图。

3.该二叉树的中序遍历顺序为dkbeiafjcgh,因此将序列一一对应填入树中,即

该树即为此序列的二叉判定树。

做题过程中熟练使用此方法比通过算法模拟来推断二叉判定树的速度要快许多倍。

在平时做题过程中,涉及到需要具体画出二叉判定树的题目,往往结点个数(序列长度)不超过2^4-1=15个,即一般为高度不超过4的树,因此可以在练习时将结点个数8-14的所有树形画几遍,就可以很熟练的掌握这个方法。

二叉判定树画出之后便可以对其他具体题目进行分别的计算,如求成功或失败的查找长度、求比较顺序、比较次数等。

【数据结构】折半查找及其二叉判定树画法相关推荐

  1. 数据结构学习记录(二)——折半查找二叉判定树的画法

    以下给出我在学习中总结的一种比较简便的构造折半二叉判定树的思路以及方法: 思路分析: 在计算mid值时,使用的时mid=(low+high)/2  .这里由于mid为int类型,自动默认为向下取整,因 ...

  2. 数据结构 | 折半查找 /二分查找 算法细节、二分查找判定树

    一.基本思想 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步 ...

  3. 【折半查找判定树画法思路】

    折半查找判定树画法思路: 1.先画出满足有序表长度的最大满二叉树,然后将剩余结点个数一个个插入该树.[二叉树前n层最多(2^n)-1个结点,第n层最多2^(n-1)个结点] 2,从上往下看,比较每个结 ...

  4. 数据结构——查找:折半查找、二叉查找(排序)树、平衡二叉树

    七大查找算法:https://www.cnblogs.com/zhang-qc/p/8745153.html 学习的地址 https://www.bilibili.com/video/av278314 ...

  5. 数据结构折半查找例题_山东2011专升本计算机专业数据结构练习题 - 图文

    第 47 页 共 63 页 济南铁道职业技术学院 专升本辅导教材 数据结构 { p=(EdgeNode *) malloc(sizeof(EdgeNode)); p->weight= (2) ; ...

  6. 数据结构折半查找例题_数据结构第9章例题与答案

    第九章  集合 一. 选择题 1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度asl为(    ).[北京航空航天大学 2000 一.8 (2分 ...

  7. 数据结构折半查找例题_数据结构查找习题及答案

    第九章 查找 一. 选择题 1. 若查找每个记录的概率均等, 则在具有 n 个记录的连续顺序文件中采用顺序查找法查找一 个记录,其平均查找长度 ASL 为 (    ) . A . (n-1)/2   ...

  8. 数据结构-折半查找法的ASL计算

    (1)通常用查找过程中对关键字的比较次数 作为衡量算法效率优劣的标准. (2)平均查找长度-ASL,相当于时间复杂度分析时的f(n)函数. (3)考研的一个考点. (4)ASL求解的关键就是建立折半查 ...

  9. 数据结构——折半查找

    采用线性方式进行折半查找: Binary_Search(int arr[],int key,int lowIndex,int upperIndex) {int middleIndex = 0;whil ...

最新文章

  1. web浏览器_如何在iPhone和iPad上更改默认的Web浏览器
  2. JavaScript(循环)
  3. linux用卸载软件管理,Linux下软件的安装卸载管理
  4. Kali Linux
  5. 如何优雅地实现判断一个值是否在一个集合中?
  6. oracle 删除表中重复记录,并保留一条
  7. 嵌入式IAP开发笔记之一:面向STM32的BootLoader程序
  8. android 控件突然变小,android中自定义控件
  9. java 内部类调用_Java内部类使用总结
  10. jmeter web监听结果_监听器-聚合报告监听性能测试结果
  11. MongoDB 主从复制(主从集群 )
  12. 北邮 网络安全 期末复习 知识点总结之防火墙
  13. 基于分类分级的医疗临床数据合规共享与安全防护建设实践
  14. vscode全屏背景图
  15. MaaS无缝出行服务呼之欲出 传统出行模式将被颠覆
  16. 基于 Stable Diffusion 一键 AI 作画:什么“小镇做题家”?人人都是艺术家
  17. 力扣242.有效的字母异位词(Java语言,排序法、散列表法)
  18. 微信支付(扫码支付)微信公众平台开发教程(6)
  19. Objective-C 之父 Brad Cox 逝世,创建过乐队、推动苹果软件生态
  20. 逻辑回归——乳腺癌分类

热门文章

  1. 新斗罗大陆手游服务器维护,《新斗罗大陆》新ss魂师天青龙牛天修复公告
  2. 基于Android的手机订餐系统设计与实现(三)
  3. 为什么有些坏习惯很难改掉?
  4. QCustomPlot 的使用-折线图和散点图
  5. [折腾]WNDRMAC刷openwrt固件实现迅雷远程下载+数据共享设置
  6. 大龄(35岁)程序员的面试经历,酸甜苦辣
  7. 2010软件设计师考试(英语部分)
  8. vue中插值表达式和14个vue指令详解
  9. 课工场 “微服私访”项目学习(五)
  10. 来自ThoughtWorks的敏捷团队角色定义