折半查找(二分查找)

news2024/11/18 15:30:13

1.算法思想

折半查找,又称“二分查找”,仅适用于有序的顺序表。

1.适用范围

顺序表拥有随机访问的特性,链表没有。

图解:(low代表左区间边界,high代表右区间边界,mid代表中间元素)
在这里插入图片描述

2.算法实现

实现步骤:

  1. 将元素进行排序
  2. 定义两个变量left,right分别遍历中间元素mid的左右区间
  3. 每一轮循环,分别与中间元素比较大小,确定目标元素的区间
  4. 若目标元素在mid的左边,则让left = mid-1;
  5. 若目标元素在mid的右边,则让right = mid+1;
  6. 并且每一轮循环,让mid = (right+left)/2;
  7. 循环结束条件:若查找成功则left = right,返回mid;若left > rigth则查找失败,返回-1.

代码实现:

typedef struct {//查找表的数据结构(顺序表)
    ElemType *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
}

3.查找判定树

1.构造方法

  • 由mid所指元素将原有元素分割到左右子树中。
  • Key:右子树结点数–左子树结点树=0或1。
  • 折半元素的计算方法:mid = [(low + high)/2](向下取整);

在这里插入图片描述

1.折半查找判定树的特点

  • 如果当前low和high之间有奇数个元素,则mid分隔后,左右两部分元素个数相等。
  • 如果当前low和high之间有偶数个元素,则mid分隔后,左半部分比右半部分少一个元素。
  • 折半查找的判定树中,则对于任何一个结点,必有右子树结点数-左子树结点数=0或1
  • 由于折半查找的判定树的任意左右子树的结点数不大于1,则该判定树一定是平衡二叉树。

2.折半查找判定树的相关计算

  • 折半查找的判定树中,只有最下面一层是不满的,因此元素个数为n时树高: h = l o g 2 ( n + 1 ) h = log_2(n +1) h=log2(n+1)
  • 判定树结点关键字:左<中<右,满足二叉排序树的定义,失败结点:n+1个(等于成功结点的空链域数量)

4.折半查找效率

1.折半查找时的ASL的计算

在不考虑失败的情况下,折半查找的树高为: l o g 2 ( n + 1 ) log_2(n+1) log2(n+1)

也就是说查找成功的ASL(平均查找长度)<=h,同样查找失败的ASL也不会超过h+1.

2.时间复杂度

所以可以得出结论:折半查找的时间复杂度应该是: O ( l o g 2 n ) O(log_2n) O(log2n)这个数量级。

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

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

相关文章

Nginx安装与常见命令

一、Nginx简介 官方文档&#xff1a;https://www.nginx.com/ Nginx中文文档&#xff1a;https://nginx.cn/doc/index.html Nginx由俄罗斯人&#xff08;Igor Sysoev&#xff09;编写的轻量级Web服务器&#xff0c;它的发音为 [ˈendʒɪnks] 。 Nginx 不仅是一款高性能的 HTTP服…

基于YOLOv8模型的烟头目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的烟头目标检测系统可用于日常生活中检测与定位车辆目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数据集…

字符串的创建及常用方法大全

字符串 1.索引思维 值类型:不会改变原来的数 var arr 100//值类型function fn(a) {a 200}fn(arr)console.log(arr);//100引用类型:会改变原来的数组 // var arr [11, 22, 33, 44]// var arr1 arr;//arr1引用了arr的地址// arr1[0] "AA"// console.log(arr1);//…

js中运算规则

法&#xff1a; 有对象&#xff0c;对象是根据object.valueof().toString()返回的值 //toString的对象 var obj2 {toString:function(){return a} } console.log(2obj2) //输出结果2a//常规对象 var obj1 {a:1,b:2 } console.log(2obj1)&#xff1b; //输出结果 2[object…

具体型号的CPU与GPU/CUDA计算能力实测记录

测试结果仅供参考&#xff0c;不一定做到非常严谨。 另外京东上查看&#xff0c;目前&#xff08;2023年9月&#xff09;i7-10700的价格好像在2000元左右&#xff1b;Quadro RTX 6000显卡&#xff0c;约2万元左右。 CUDA适合大批量的并行计算&#xff0c;CPU更加擅长分支预测以…

医院安全不良事件报告系统源码 PHP+ vue2+element+ laravel8+ mysql5.7+ vscode开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

华为云云耀云服务器L实例使用教学:安装jdk和配置环境变量

最近各个平台都被华为mate60的消息霸屏了&#xff0c;5g麒麟&#xff0c;库克来了都不行 华为除了做手机&#xff0c;在云计算领域也有很多年的深耕&#xff0c;华为作为全球领先的信息和通信技术&#xff08;ICT&#xff09;解决方案提供商&#xff0c;一直以其创新的产品和服…

如何管理敏捷开发迭代,Sprint Backlog管理?

​什么是Sprint Backlog&#xff1f; Sprint Backlog是Scrum的主要工件之一。在Scrum中&#xff0c;团队按照迭代的方式工作&#xff0c;每个迭代称为一个Sprint。在Sprint开始之前&#xff0c;PO会准备好产品Backlog&#xff0c;准备好的产品Backlog应该是经过梳理、估算和优…

《C++ primer》练习3.17:改写单词为大写

最近看《C primer》&#xff0c;有这样一个题目 从cin读入一组词并把它们存入一个vector 对象&#xff0c;然后设法把所有词都改写为大写形式。输出改变后的结果&#xff0c;每个词占一行。 考察 怎么输入字符串怎么存入vector对象怎么对字符串字符处理 代码 #include <i…

什么是lockbit勒索病毒,中了勒索病毒怎么办?勒索病毒解密,数据恢复

lockbit是一种勒索病毒&#xff0c;是一种极具破坏性的电脑病毒&#xff0c;它利用加密技术来锁定用户文件&#xff0c;并以此为条件向用户勒索钱财。lockbit病毒的传播方式有通过电子邮件附件、恶意网站、点对点网络等多种途径进行传播。这种病毒一旦侵入电脑系统&#xff0c;…

Redis——zset类型详解

概要 zset是有序集合&#xff0c;将zset中的members引入一个属性score&#xff0c;根据这个属性值来进行排序&#xff0c;其中members不可以重复&#xff0c;score可以重复&#xff08;按照字典序排序&#xff09;&#xff0c;默认按照升序排序 有序集合中提供指定分数和元素…

使用POI实现操作Excel文件。

1、添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-o…

Keras入门与残差网络的搭建

发现草稿箱里还有一篇很早之前的学习笔记&#xff0c;希望可以帮助到有需要的童鞋~ 目录 1、keras入门 2、残差网络 &#xff08;ResNet&#xff09; 2.1、恒等块 2.2、卷积块 搭建一个50层的残差网络 自己的测试数据 1、keras入门 本文参考参考 Keras模型大纲&#xff…

SSM SpringBoot vue快递柜管理系统

SSM SpringBoot vue快递柜管理系统 系统功能 登录 注册 个人中心 快递员管理 用户信息管理 用户寄件管理 配送信息管理 寄存信息管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端: vue 数据库&#xff1a;Mys…

《VulnHub》DarkHole:1

VulnHub 1&#xff1a;靶场信息2&#xff1a;打靶2.1&#xff1a;情报收集&威胁建模2.2&#xff1a;漏洞分析&渗透攻击 3&#xff1a;总结3.1&#xff1a;命令&工具3.1.1&#xff1a;Nmap 3.2&#xff1a;关键技术 VulnHub 打靶记录。官网&#xff1a;https://www.…

C++零碎记录(十)

17. 继承对象内存 17.1 查询继承对象所占内存 #include <iostream> using namespace std; #include<string>//继承中的对象模型class Base { public:int m_A; protected:int m_B; private:int m_C; };//公共继承 class Son:public Base {int m_D; };//利用开发人…

在Creo 6.0中画图模板问题

在Creo 6.0中&#xff0c;文件的默认模板是英制模板“inlbs_part_solid”,此文件模板中尺寸的单位是inch。我们建模中需要的单位是mm&#xff0c;改变Creo文件默认的单位有两种方法。 1 【新建】对话框取消勾选【使用默认模板】对话框 &#xff08;1&#xff09;单击主页选项…

从板凳围观到玩转行家:Moonbeam投票委托如何让普通用户一同参与

今年5月&#xff0c;Moonbeam发起了一项社区链上治理中投票委托反馈的调查。187位社区成员参与了这项调查&#xff0c;调查发现受访者对治理感兴趣&#xff0c;增加参与度只需要进行一些调整&#xff0c;即更简化的投票流程。 治理和去中心化是Web3的核心&#xff0c;随着Moon…

2023/9/11 qtc++

#include <iostream> #include <cstring> using namespace std; class myString { private:char *str;int size; public://无参构造myString():size(10){str new char[size]; //构造出一个长度为10的字符串strcpy(str,""); //赋值为空串}//有…

@ApiImplicitParams这个注解的作用

ApiImplicitParams这个注解的作用&#xff1f; ApiImplicitParams是一个用于描述方法参数的注解&#xff0c;它可以用在方法上&#xff0c;作用是为方法中的参数定义多个注解&#xff0c;并将这些注解集中到一个注解集中进行统一管理。通过ApiImplicitParams注解&#xff0c;我…