数据结构——四十、折半查找(王道408) - 教程

news/2025/12/9 12:49:23/文章来源:https://www.cnblogs.com/tlnshuju/p/19326039

数据结构——四十、折半查找(王道408) - 教程

2025-12-09 12:46  tlnshuju  阅读(0)  评论(0)    收藏  举报

文章目录

  • 前言
  • 一.算法思想
    • 1.思路
    • 2.举例
      • 1.查找成功
      • 2.查找失败
  • 二.代码实现
  • 三.查找效率分析
    • 1.分析过程
    • 2.结论
  • 四.折半查找判定树的特性
    • 1.右子树结点数-左子树结点数=0或1
      • 1.分析过程
      • 2.结论
      • 3.题目
    • 2.折半查找的判定树一定是平衡二叉树
    • 3.折半查找的判定树一定是二叉排序树
  • 五.折半查找的查找效率
  • 六.知识回顾与重要考点
  • 结语

前言

本文介绍了折半查找(二分查找)的基本思想、实现方法和查找效率分析。折半查找仅适用于有序顺序表,通过不断缩小查找区间来定位目标元素。文章通过示例演示了查找成功和失败的流程,并提供了升序和降序排列时的C语言实现代码。在效率分析部分,通过构建判定树计算了成功和失败情况下的平均查找长度(ASL),指出折半查找判定树具有右子树结点数-左子树结点数=0或1的特性,且一定是平衡二叉树和二叉排序树。最后说明元素个数为n时,判定树高度为⌈log₂(n+1)⌉(不含失败结点)或⌈log₂(n+1)⌉+1(含失败结点)。

一.算法思想

1.思路

  • 折半查找,又称“二分查找”,仅适用于有序顺序表
  • 当前检查的这个元素,把目前有可能出现目标元素的这一整个区间一分为二,分为了左边的区间和右边的区间,根据我们想要找的这个关键字和当前被检查元素的这个大小关系,我们就可以知道我们到底应该是在左边还是右边来查找
  • 循环上述操作,在不停的缩小区间后,如果元素存在

2.举例

1.查找成功

在这里插入图片描述

  • 假设我们现在要在这个有序的顺序表当中找到33这个元素,那首先我们会用两个指针,low和high来分别指向我们目前要搜索的这个区间范围
    在这里插入图片描述
  • 第一轮我们要检查的元素是low和high他们中间的一个元素,我们用一个指针mid=(low+high)/2来指向它
    在这里插入图片描述
  • 因此第一个检查的元素是29,子现在对比mid的所指向的元素,还有我们的目标关键字33会发现我们要查找的目标要大于当前mid的所指向的这个元素,所以如果33这个元素存在的话,那么一定是在mid的所指位置的右边这个部分,因此我们要做的就是把low这个指针指向6这个位置
    在这里插入图片描述
  • 同样是检查 low和high这个区域内的中间那个元素mid,这个元素的值是37,37是要大于33的,所以如果33存在的话,那么肯定是在mid的所指位置的左边这个区域
    在这里插入图片描述
  • 因此接下来我们会让high指针指向7这个位置
    在这里插入图片描述
  • 接下来操作也是一样,mid指针指向6,32<33,因此在mid的右边寻找,因此接下来我们会让low这个指针指向mid的右边那个位置
    在这里插入图片描述
  • 同样的,此时mid指向7,33=33,恰好就是我们要查找的目标

2.查找失败

在这里插入图片描述

  1. 其他步骤和之前一样,只是最后一步的判断条件略有不同
    在这里插入图片描述
  2. 此时检查的就是10这个元素,那由于我们要找的目标12依然是大于10的,所以如果12存在的话,那只有可能是在mid的所指的右边那个区间内,所以和刚才的处理逻辑一样,我们会让lowi这个值等于mid+1
    在这里插入图片描述

二.代码实现

typedef struct{//查找表的数据结构(顺序表)
Element *elem;//动态数组基址
int TableLen;//表的长度
}SSTable;
//折半查找(元素升序排列)
int Binary_Search(SSTable L, ElemType key){
int low=0, high=L. TableLen-1, mid;
while(low<=high){
mid=(low+high)/2; //取中间位置
if(L. elem[mid]==key)
return mid; //查找成功则返回所在位置
else if(L. elem[mid]>key)
high=mid-1; //从前半部分继续查找
else
low=mid+1; //从后半部分继续查找
}
return -1; //查找失败,返回-1
}
//折半查找(元素降序排列)
int Binary_Search(SSTable L, ElemType key){
int low=0, high=L. TableLen-1, mid;
while(low<=high){
mid=(low+high)/2; //取中间位置
if(L. elem[mid]==key)
return mid; //查找成功则返回所在位置
else if(L. elem[mid]<key)
high=mid-1; //从前半部分继续查找
else
low=mid+1; //从后半部分继续查找
}
return -1; //查找失败,返回-1
}

三.查找效率分析

1.分析过程

在这里插入图片描述

2.结论

  • ASL成功=(1∗1+2∗2+3∗4+4∗4)/11=3ASL_\text{成功} = (1*1+2*2+3*4+4*4)/11 = 3ASL成功=(11+22+34+44)/11=3
  • ASL失败=(3∗4+4∗8)/12=11/3ASL_\text{失败}=(3*4+4*8)/12=11/3ASL失败=(34+48)/12=11/3

四.折半查找判定树的特性

1.右子树结点数-左子树结点数=0或1

1.分析过程

  • 如果当前low和high之间有奇数个元素,则mid分隔后左右两部分元素个数相等
    在这里插入图片描述

  • 如果当前low和high之间有偶数个元素,则mid分隔后左半部分比右半部分少一个元素
    在这里插入图片描述

2.结论

3.题目

  • 练习:若mid=⌊(low++high)/2⌋mid=\lfloor(low++high)/2\rfloormid=⌊(low++high)/2,画出含1个元素、2个元素、3个元素…16个元素的查找表对应的折半查找判定树,注:暂不考虑失败结点(Key:右子树结点数-左子树结点数=0或1
    解:1.一个元素:
    在这里插入图片描述
    2.两个元素,由于右子树结点只可能比左子树更多,因此:在这里插入图片描述
    3.三个元素,由于右子树最多比左子树多一个结点,因此:在这里插入图片描述
    4.十六个元素,按照之前的规律依次往后推演
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

注:图中数字只是一个编号,并不是关键字的值

一点小规律:从根节点出发,编号的顺序是左孩子的左孩子编号->最左边的堂兄弟结点的左孩子的左孩子编号->兄弟结点的左孩子的左孩子编号->最左边的堂兄弟结点最近的兄弟结点的左孩子的左孩子编号->…(以此类推)
左孩子编完后编右孩子,右孩子的编号顺序也是和左孩子一样的

2.折半查找的判定树一定是平衡二叉树

  • 任何一个节点的左子树和右子树的深度之差都不会超过1
  • 折半查找的判定树中,只有最下面一层是不满的因此,元素个数为n时树高h=⌈log⁡2(n+1)⌉h=\left\lceil\log_2(n+1)\right\rceilh=log2(n+1)(和完全二叉树相同)(不包含失败结点,如果包含失败结点,则其树高h=⌈log⁡2(n+1)⌉+1h=\left\lceil\log_2(n+1)\right\rceil+1h=log2(n+1)+1)

3.折半查找的判定树一定是二叉排序树

  • 判定树结点关键字:左<中<右,满足二叉排序树的定义
  • 失败结点:n+1个(等于成功结点的空链域数量)

五.折半查找的查找效率

六.知识回顾与重要考点

在这里插入图片描述

  • 拓展思考
    折半查找时间复杂度=O(log₂n)
    顺序查找的时间复杂度=O(n)
    那么,折半查找的速度一定比顺序查找更快?
    答:不一定,只是平均查找速度更快
    在这里插入图片描述
    如果mid=⌈(low+high)/2⌉mid=\lceil(low+high)/2\rceilmid=⌈(low+high)/2
    那么,判定树是什么样子?
    答:
    在这里插入图片描述
    如果当前low和high之间有奇数个元素,则mid分隔后,左右两部分元素个数相等
    在这里插入图片描述
    如果当前low和high之间有偶数个元素,则mid分隔后,左半部分比右半部分多一个元素
    在这里插入图片描述

结语

二更,最近事情比较多,更新会有延迟

如果想查看更多章节,请点击:一、数据结构专栏导航页

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/994702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年知名的双铂金火花塞供应商推荐,比较好的双铂金火花塞

在汽车后市场的精细化发展浪潮中,双铂金火花塞凭借5-6万公里的超长寿命、稳定的点火性能与适配中端车型的高性价比,成为追求省心养护车主的核心选择。面对市场上良莠不齐的供应商,如何找到技术可靠、品质稳定的源头…

2025年五大有实力的小红书代运营公司推荐,小红书代运营品牌

在流量分散的数字化时代,小红书作为年轻人的生活方式平台,已成为品牌种草、获客转化的核心阵地。但多数企业面临不懂规则、缺内容团队、资源不足、效果难控等痛点,专业小红书代运营公司成为破局关键。以下结合服务能…

安阳七彩祥云网络公司的实力怎样?行业口碑如何?值得信任不?

本榜单依托本地企业真实合作反馈、服务案例落地效果与技术创新能力,筛选出5家适配豫北中小企业需求的互联网营销服务商,为企业解决获客难、营销成本高的痛点提供精准参考。 TOP1 推荐:安阳市七彩祥云软件开发有限责…

2025年安阳五大比较好的短视频拍摄剪辑品牌企业排行榜,实力

为帮安阳及周边企业高效锁定适配自身需求的短视频拍摄剪辑合作伙伴,避免选型走弯路,我们从内容创意能力、拍摄制作水准、运营推广效果及真实客户口碑四大维度,对多家服务商展开深度评估,终精心筛选出2025年值得企业…

实用指南:动态规划、贪心算法与分治算法:深入解析与比较

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

AI编程工具:效率提升与技能危机的双重挑战

本文探讨了AI代码生成工具如何通过自动化任务、实时调试和重构来提升开发效率,同时也分析了其过度依赖可能削弱开发者实践技能与深层理解的风险,并提出了将AI作为交互式导师来融合自动化与教育的路径。AI编程工具:效…

新人求职指南(2):大学参加这些竞赛,求职时直接“弯道超车”!

新人求职指南(2):大学参加这些竞赛,求职时直接“弯道超车”!大家好,我是jobleap.cn的小九。 找工作时总焦虑简历没亮点、竞争力不够?其实大学期间的竞赛经历,正是帮你脱颖而出的“加分项”——不仅能丰富阅历、提…

2025年浙江发泡混凝土生产厂家排名,看看哪家技术实力强?

本榜单依托行业技术实力、项目案例与客户口碑,深度筛选出五家标杆发泡混凝土企业,为建筑工程企业选型提供客观依据,助力精准匹配适配的材料与工程服务伙伴。 TOP1 推荐:宁波市弘旺建筑科技有限公司 推荐指数:★★…

2025年中国菌袋分离机生产厂排名:菌袋分离机生产厂哪家更值

本榜单依托食用菌机械行业深度调研与真实客户口碑,聚焦菌袋分离机核心性能、产能适配性及售后服务,筛选出五家标杆企业,为食用菌种植户、有机肥厂等客户精准选型提供客观依据。 TOP1 推荐:河南力王机械设备有限公…

2025年度北京法拍服务公司排名TOP5:兴业启航项目经验多

在法拍资产投资领域,专业机构的选择直接决定了投资安全与收益。面对市场上良莠不齐的服务商,如何判断其项目经验、实力与行业影响力?以下为您盘点2025年度北京地区的5家法拍服务公司,深度解析兴业启航(北京)国际…

2025年古装化妆学校五大实力推荐,看看哪家教学模式先进?

在影视行业蓬勃发展、古风文化持续升温的当下,掌握专业的古装化妆、剧组造型或美甲化妆技能,成为许多人进入美业的敲门砖。面对市场上琳琅满目的美业学校,如何选择靠谱的机构?以下是2024年长沙及周边地区值得推荐的…

【开发者导航】高准确率多语言语音识别与合成程序:Whisper

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

django模型数据查询 - 教程

django模型数据查询 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

2025年口碑好的耐高温pps滤袋生产厂家排行榜,新测评精选

为帮环保工程企业高效锁定适配恶劣工况需求的PPS滤袋供应商,避免因滤袋性能不足导致除尘系统瘫痪、合规风险升高,我们从耐温耐腐蚀核心性能(高温磺化抗性、化学介质耐受性)、生产工艺稳定性(自动化设备占比、质检…

2025年宜昌本地实力不错的短视频拍摄公司排行榜,中小企业营

为帮助宜昌及周边中小企业精准锁定适配的短视频营销合作伙伴,解决内容差、转化低、服务慢的痛点,我们从技术资源整合力(平台战略合作、AI工具应用)、本地化服务响应(48小时方案输出、线下上门沟通)、行业案例适配…

2025资质齐全信誉好的小红书代运营专业公司TOP5推荐

在流量分散、营销内卷的时代,中小企业对专业小红书代运营服务的需求日益迫切。数据显示,2024年小红书企业账号增速超60%,但超40%的企业因运营能力不足、资源短缺陷入增长困境。为帮助企业精准选型,本榜单基于平台合…

2025年安阳地区十大靠谱短视频拍摄剪辑公司推荐:服务不错、

本榜单基于安阳本地市场调研与真实客户口碑,聚焦服务不错、靠谱、有实力核心维度,筛选出十家标杆企业,为本地企业选型提供客观依据,助力精准匹配短视频营销伙伴。 TOP1 推荐:安阳市七彩祥云软件开发有限责任公司 …

cmake构建python调用C++

了解到python写界面很方便也美观,想搞个小场景,实现用python写界面调用C++程序的流程。 小场景:计算加法 1、Python 程序show.py :创建了一个 GUI 界面,让用户输入两个数字,点击"相加"按钮时,调用C++…

不锈钢风机公司TOP1!不锈钢风机哪个品牌好?

在工业通风领域,“耐腐蚀、高可靠”是不锈钢风机的核心,英飞不锈钢风机YFBCSL、YFBCSR、YFBCSK、YFBCSU、YFBCSO、YFBCSE、YFBCSC、YFFCSC覆盖工艺送排风、防爆排烟、高压输送等全场景需求,打造耐腐蚀、耐磨损、耐高…

2025年最新拖车平台推荐,这5家服务好、口碑佳!,拖车推荐排行聚焦优质品牌综合实力排行

随着汽车保有量的持续增长和跨区域流动的日益频繁,汽车托运(俗称“拖车”)服务已成为连接二手车交易、个人异地迁移、新车配送等场景的关键纽带。面对市场上众多的服务提供商,消费者如何选择一家安全、高效、透明的…