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

数据结构 专栏收录该内容
22 篇文章 1 订阅

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

其特点有以下几个:

  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的所有树形画几遍,就可以很熟练的掌握这个方法。

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

  • 14
    点赞
  • 3
    评论
  • 34
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

攀枝花学院本科学生课程设计任务书 题 目 二叉排序与平衡二叉的实现 1、课程设计的目的 使学生进一步理解和掌握课堂上所学各种基本抽象数据类型的逻辑结构、存储结构和操作实现算法,以及它们在程序中的使用方法。 使学生掌握软件设计的基本内容和设计方法,并培养学生进行规范化软件设计的能力。 3) 使学生掌握使用各种计算机资料和有关参考资料,提高学生进行程序设计的基本能力。 2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等) (1) (1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序T; (2)对二叉排序T作中序遍历,输出结果; (3)计算二叉排序T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”; (5)用数列L,生成平衡的二叉排序BT:当插入新元素之后,发现当前的二叉排序BT不是平衡的二叉排序,则立即将它转换成新的平衡的二叉排序BT; (6)计算平衡的二叉排序BT的平均查找长度,输出结果。 3、主要参考文献 [1]刘大有等,《数据结构》(C语言版),高等教育出版社 [2]严蔚敏等,《数据结构》(C语言版),清华大学出版社 [3]William Ford,William Topp,《Data Structure with C++》清华大学出版社 [4]苏仕华等,数据结构课程设计,机械工业出版社 4、课程设计工作进度计划 第1天 完成方案设计与程序框图 第2、3天 编写程序代码 第4天 程序调试分析和结果 第5天 课程设计报告和总结 指导教师(签字) 日期 年 月 日 教研室意见: 年 月 日 学生(签字): 接受任务时间: 年 月 日 注:任务书由指导教师填写。 课程设计(论文)指导教师成绩评定表 题目名称 二叉排序与平衡二叉的实现 评分项目 分值 得分 评价内涵 工作 表现 20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。 02 科学实践、调研 7 通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。 03 课题工作量 7 按期圆满完成规定的任务,工作量饱满。 能力 水平 35% 04 综合运用知识的能力 10 能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。 05 应用文献的能力 5 能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。 06 设计(实验)能力,方案的设计能力 5 能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。 07 计算及计算机应用能力 5 具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。 08 对计算或实验结果的分析能力(综合分析能力、技术经济分析能力) 10 具有较强的数据收集、分析、处理、综合的能力。 成果 质量 45% 09 插图(或图纸)质量、篇幅、设计(论文)规范化程度 5 符合本专业相关规范或规定要求;规范化符合本文件第五条要求。 10 设计说明书(论文)质量 30 综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。 11 创新 10 对前人工作有改进或突破,或有独特见解。 成绩 指导教师评语 指导教师签名: 年 月 日 摘要及关键字 本程序中的数据采用“结构”作为其数据结构。具体采用的是“二叉排序”。 二叉排序(又称二叉查找):(1)若左子不空,则左子上所有节点的值均小于它的根结点的值;(2)若右子不空,则右子上所有节点均大于它的根结点的值;(3)它的左右子分别为二叉排序二叉平衡:若不是空,则(1)左右子都是平衡二叉;(2)左右子的深度之差的绝对值不超过1。 本次实验是利用二叉排序和平衡二叉达到以下目的:(1)以回车('\n')为输入结束标志,输入数列L,生成一棵二叉排序T;(2)对二叉排序T作中序遍历,输出结果;(3)计算二叉排序T查找成功的平均查找长度,输出结果; (4)输入元素x,查找二叉排序T,若存在含x的结点,则删该结点,并作中序遍历(执行操作2);否则输出信息“无x”;(5)用数列L,生成平衡的二叉排序BT:当插入新元素之后,发现当前的二叉排序
©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值