数据结构 -- 顺序查找和折半查找

查找的基本概念

基本概念

查找:在数据集合中寻找满足某种条件的数据元素的过程

查找表(查找结构):用于查找的数据集合称为查找表,它由同一类型的数据结构元素(或记录)组成

关键字:唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的

对查找表的常见操作

①查找符合条件的数据元素

②插入、删除某个数据元素

只需要进行操作①–静态查找表–著需要关注查找速度

也要进行操作②–动态查找表–还需要关注插入、删除操作是否方便实现

查找算法的评价指标

查找长度:查找运算中,需要对比关键字次数

平均查找长度(ASL):查找过程中进行关键字比较次数的平均值

通常考虑查找成功、查找失败两种情况下的ASL

在这里插入图片描述

顺序查找

算法思想

从头到尾/从尾到头依次查找

基本实现
typedef struct{ElemType *elem;int TableLen;
}SSTable;//顺序查找
int Search_Seq(SSTable ST,ElemType key){int i;for(i = 0;i<ST.TableLen && ST.elem[i] != key;++i);return i==ST.TableLen?-1:i;
}
实现(哨兵)
typedef struct{ElemType *elem;int TableLen;
}SSTable;//顺序查找
int Search_Seq(SSTable ST,ElemType key){ST.elem[0] = key;					//查找表中从1号位置开始存放数据,0号位置存放“哨兵”int i;for(i = ST.TableLen;ST.elem[i] != key;--i);return i;							//查找成功,返回元素下标;查找失败,返回0
}

优点:无需判断是否越界,执行效率更高(但是并没有质的提升)

效率分析

查找成功:ASL=(n+1)/2 时间复杂度:O(n)

查找失败:ASL=n+1 时间复杂度:O(n)

顺序查找的优化(对有序表)

以查找表中元素递增存放为例:

若查找到某个元素大于查找目标,则可判定为查找失败(后面的元素都大于查找目标)

ASL(失败) = (1+2+……+n+n)/n+1 = n/2+n/(n+1)

查找算法判定树分析ASL

在这里插入图片描述

一个成功节点的查找层数 = 自身所在的层数

一个失败节点的查找长度 = 其父节点所在的层数

默认情况下,各种成功情况或失败情况都等概率发生

折半查找(考察频率高)

算法思想

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

每次将查找范围折半,逐步缩小查找区间,直到找到目标元素或查找区间为空。

前提:数据必须是有序的(通常是升序)。

取中间元素:

  • 计算中间下标 mid = (low + high) // 2

比较中间元素和目标值:

  • target == arr[mid]:查找成功。
  • target < arr[mid]:继续在左半部分查找。
  • target > arr[mid]:继续在右半部分查找。

重复步骤 2-3,直到找到目标或范围为空(low > high)。

算法实现
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)low = mid+1;			//从后半部分查找elsehigh = mid-1;			//从前半部分查找}return -1;
}
查找效率分析

例:

在这里插入图片描述

ASL(成功) = (1*1 + 2*2 + 3*4 + 4*4)/11 = 3

ASL(失败) = (3*4+4*8)/12 = 11/3

查找判定树的构造

如果当前low和high之间有奇数个元素,则mid分割后,左右两部分元素个数相等

如果当前low和high之间有偶数个元素,则mid分割后,左半部分比右半部分少一个元素

折半查找的判定树中,若mid = [(low+high)/2] 则对于任何一个结点,必有:右子树个数-左子树个数 = 0或1

在这里插入图片描述

折半查找的判定树一定只有最下面一层是不满的

h = [log2(n+1)]

在这里插入图片描述

判定树结点关键字:左<中<右,满足二叉排序树的定义

失败节点:n+1(等于成功结点的空链域数量)

折半查找的查找效率

树高h = [log2(n+1)] 查找成功ASL ≤ h 查找失败ASL ≤ h

时间复杂度O(log2n)

[!WARNING]

折半查找的速度一定比顺序查找更快?

❌ 一般情况下,折半查找比顺序查找表现优秀,但不是所有情况下折半查找都更快

若mid = (low+high)/2(向上取整) ?

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

在这里插入图片描述

分块查找(手算模拟+平均查找长度)

分块查找的算法思想

eg. 第一个区间:≤10 第二个区间:≤20 ……

“索引表”中保存每个分块的最大关键字和存储的区间

特点:块内无序,块间有序

typedef struct{ElemType maxValue;int low,high;
}Index;//顺序表存储实际元素
ElemType List[100];

算法过程:

①在索引表中确定待查记录所属的分块(可顺序、可折半)

②在块内顺序查找

用折半查找查索引

若索引表中不包含目标关键字,则折半查找索引表最终停在low>high,要在low所指的分块中进行查找

low超出索引表的范围时,查找失败

查找效率分析(ASL)

在这里插入图片描述

共有14个元素可能被查找,各自被查找的概率为1/14

若索引表顺序查找

7(2)、10(3)、13(3)……

若索引表折半查找(一般不考、计算量大)

30(4)✔、27(2)❌

查找失败的情况(更复杂,一般不考)

【可能会考的情况】(顺序查找,效率和最优分块)

在这里插入图片描述
在这里插入图片描述

【拓展思考】

若查找表是“动态查找表”,更好的实现方式 – 使用链式存储

(否则在目标关键字插入时,需要大量元素的移动)

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

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

相关文章

汽车功能安全--TC3xx MBIST设计要点

英飞凌针对硬件故障的自测&#xff0c;提供了四种机制&#xff1a;PBIST、LBIST、MONBIST和MBIST。 LBIST和MONBIST我们已经聊过了&#xff0c;今天就快速介绍下MBIST。 MBIST&#xff0c;全程Memory Built-in Self Test&#xff0c;用于检测SRAM数据单元的完整性。 在26262…

openpi 入门教程

系列文章目录 目录 系列文章目录 前言 一、运行要求 二、安装 三、模型检查点 3.1 基础模型 3.2 微调模型 四、运行预训练模型的推理 五、在自己的数据上微调基础模型 5.1. 将数据转换为 LeRobot 数据集 5.3. 启动策略服务器并运行推理 5.4 更多示例 六、故障排除…

java加强 -Collection集合

集合是一种容器&#xff0c;类似于数组&#xff0c;但集合的大小可变&#xff0c;开发中也非常常用。Collection代表单列集合&#xff0c;每个元素&#xff08;数据&#xff09;只包含1个值。Collection集合分为两类&#xff0c;List集合与set集合。 特点 List系列集合&#…

深入理解ThingsBoard的Actor模型

1、ThingsBoard系统中定义了哪些Actor ✅ ThingsBoard Actor 创建机制与作用对照表: Actor 类型 何时创建 由谁创建 是否缓存 作用描述 SystemActor 系统启动时 DefaultActorService / ActorSystem ✅ 是 ★ ThingsBoard 平台服务级别管理器:负责创建所有的Actor AppActor

WPS一旦打开,就会修改默认打开方式,怎么解?

目录 前言 解决方法 结语 前言 电脑上同时存在WPS和微软的Office全家桶&#xff0c;但是我更喜欢用Office全家桶。前几天刚在设置改过来&#xff0c;忘记更改pdf文件打开默认应用。结果没过几天&#xff0c;不小心用WPS打开pdf文件时候&#xff0c;给我把默认设置全改回去了…

深度学习中--模型调试与可视化

第一部分&#xff1a;损失函数与准确率的监控&#xff08;Loss / Accuracy Curve&#xff09; 1. 为什么要监控 Loss 与 Accuracy&#xff1f; Loss 是模型优化的依据&#xff0c;但它可能下降了 Accuracy 反而没变&#xff08;过拟合信号&#xff09; Accuracy 才是评估效果的…

中间件-RocketMQ

RocketMQ 基本架构消息模型消费者消费消息模式顺序消息机制延迟消息批量消息事务消息消息重试最佳实践 基本架构 nameServer: 维护broker列表信息&#xff0c;客户端连接时只需要连接nameServer。可配置成集群。 broker&#xff1a;broker分为master和slave&#xff0c;master负…

anaconda3如何切换虚拟环境

在 Anaconda3 中切换虚拟环境可以通过 命令行 或 Anaconda Navigator 图形界面实现。以下是详细步骤&#xff1a; 方法1&#xff1a;通过命令行切换&#xff08;推荐&#xff09; 1. 查看所有虚拟环境 conda env list # 或 conda info --envs 输出示例&#xff1a; base …

【vue】axios网络请求介绍

一、基础使用 1.引入js文件 2.在methods中的函数里写 axios.get(路径) .then((res))>{ console.log(res.data)&#xff1b;//控制台打印结果数据 this.listArrres.data//定义数组来接收返回来的数据 }&#xff09; 二、参数传递 参数传递一般在路径后面使用 params:{ num:2,…

机器学习 --- KNN算法

机器学习 — KNN算法 文章目录 机器学习 --- KNN算法一&#xff0c;sklearn机器学习概述二&#xff0c;KNN算法---分类2.1样本距离判断2.2 KNN算法原理2.3 KNN缺点2.4 API2.5 使用sklearn中鸢尾花数据集实现KNN 一&#xff0c;sklearn机器学习概述 获取数据、数据处理、特征工…

Spring Boot 中的重试机制

Retryable 注解简介 Retryable 注解是 Spring Retry 模块提供的&#xff0c;用于自动重试可能会失败的方法。在微服务架构和分布式系统中&#xff0c;服务之间的调用可能会因为网络问题、服务繁忙等原因失败。使用 Retryable 可以提高应用的稳定性和容错能力 1。 使用步骤 &…

FPGA生成随机数的方法

FPGA生成随机数的方法&#xff0c;目前有以下几种: 1、震荡采样法 实现方式一&#xff1a;通过低频时钟作为D触发器的时钟输入端&#xff0c;高频时钟作为D触发器的数据输入端&#xff0c;使用高频采样低频&#xff0c;利用亚稳态输出随机数。 实现方式二&#xff1a;使用三个…

(五)毛子整洁架构(分布式日志/Redis缓存/OutBox Pattern)

文章目录 项目地址一、结构化日志1.1 使用Serilog1. 安装所需要的包2. 注册服务和配置3. 安装Seq服务 1.2 添加分布式id中间件1. 添加中间件2. 注册服务3. 修改Application的LoggingBehavior 二、Redis缓存2.1 添加缓存1. 创建接口ICaching接口2. 实现ICaching接口3. 注册Cachi…

Vue.js 全局导航守卫:深度解析与应用

在 Vue.js 开发中&#xff0c;导航守卫是一项极为重要的功能&#xff0c;它为开发者提供了对路由导航过程进行控制的能力。其中&#xff0c;全局导航守卫更是在整个应用的路由切换过程中发挥着关键作用。本文将深入探讨全局导航守卫的分类、作用以及参数等方面内容。 一、全局…

使用FastAPI和React以及MongoDB构建全栈Web应用05 FastAPI快速入门

一、FastAPI概述 1.1 什么是FastAPI FastAPI is a modern, high-performance Python web framework designed for building APIs. It’s rapidly gaining popularity due to its ease of use, speed, and powerful features. Built on top of Starlette, FastAPI leverages a…

如何查看打开的 git bash 窗口是否是管理员权限打开

在 git bash 中输入&#xff1a; net session >nul 2>&1 && (echo Ok) || (echo Failed) 显示 OK 》是管理员权限&#xff1b; 显示 Failed 》不是管理员权限。 如何删除此步生成的垃圾文件&#xff1a; 新建一个 .txt 文件&#xff0c;输入以下代码…

得物0509面试手撕题目解答

题目 使用两个栈&#xff08;一个无序栈和一个空栈&#xff09;将无序栈中的元素转移到空栈&#xff0c;使其有序&#xff0c;不允许使用其他数据结构。 示例&#xff1a;输入&#xff1a;[3, 1, 6, 4, 2, 5]&#xff0c;输出&#xff1a;[6, 5, 4, 3, 2, 1] 思路与代码 如…

基于 Nexus 在 Dockerfile 配置 yum, conda, pip 仓库的方法和参考

在 Nexus 配置代理仓库的方法&#xff0c;可参考 pypi 的配置博客&#xff1a;https://hellogitlab.com/CI/docker/create_your_nexus_2 更多代理格式&#xff0c;参考官方文档&#xff0c;如 pypi&#xff1a;https://help.sonatype.com/en/pypi-repositories.html 配置 yum…

[6-8] 编码器接口测速 江协科技学习笔记(7个知识点)

1 2 在STM32微控制器的定时器模块中&#xff0c;CNT通常指的是定时器的计数器值。以下是CNT是什么以及它的用途&#xff1a; 是什么&#xff1a; • CNT&#xff1a;代表定时器的当前计数值。在STM32中&#xff0c;定时器从0开始计数&#xff0c;直到达到预设的自动重装载值&am…

RabbitMQ ③-Spring使用RabbitMQ

Spring使用RabbitMQ 创建 Spring 项目后&#xff0c;引入依赖&#xff1a; <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp --> <dependency><groupId>org.springframework.boot</groupId><artifac…