数据结构——7.17.2 查找的基本概念、顺序查找和折半查找

7.1&7.2 查找的基本概念、顺序查找和折半查找

1. 基本概念

1.  关键字:数据元素中标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。2.  查找表的常见操作1.  查找符合条件的数据元素:查得快即可2.  插入、删除某个数据元素:兼顾查找速度和操作便捷3.  查找算法的评价指标1.  查找长度——在查找运算中,需要对比关键字的次数称为查找长度2.  平均查找长度(ASL,Average Search Length)——所有查找过程中进行关键字的比较次数的平均值

2. 顺序查找

也称:线性查找,即遍历,常用于线性表(顺序、链表)

顺序查找,是一种简单的查找方式。这种查找方法从列表的一端开始,顺序搜索直到找到所需的元素为止。

顺序查找的基本思想是:从列表的第一个元素开始,逐个检查每个元素,直到找到所需的元素或搜索到列表的末尾为止。

顺序查找的步骤如下:
  1. 从列表的第一个元素开始,与所要查找的元素进行比较。
  2. 如果相等,则查找成功,返回该元素在列表中的位置。
  3. 如果不相等,则继续向后查找下一个元素。
  4. 重复以上步骤,直到找到所需元素或搜索到列表的末尾。

顺序查找的时间复杂度是O(n),其中n是列表中元素的数量。这是因为在最坏的情况下,可能需要检查列表中的每个元素。虽然顺序查找在某些情况下可能不是最高效的查找方法,但它简单易懂,适用于小型列表或对效率要求不高的场景。

优化思路:将大概率要被查询的值放到前面来;该方法适用于经常需要查询的情况

顺序查找虽然简单易懂,但在处理大型数据集时效率较低。为了优化顺序查找的性能,可以考虑以下几种方法:

  1. 减少比较次数

    • 预处理数据:在搜索前对数据进行排序,可以减少平均情况下的比较次数。虽然排序本身需要时间,但对于多次查找的情况,排序可能是一个值得的预处理步骤。
    • 利用数据的特性:如果数据具有某种模式或分布,可以设计更高效的查找策略。
  2. 使用哨兵或标记

    • 在列表的末尾添加一个哨兵值或标记,这样当查找的元素不存在时,可以更快地停止查找。
  3. 分块查找

    • 将列表分成多个块,每个块内部可以是无序的,但块之间是有序的。首先确定目标元素可能存在的块,然后在该块内进行顺序查找。这种方法结合了顺序查找和索引查找的优点。
  4. 使用更好的数据结构

    • 如果可能的话,使用更高效的数据结构(如哈希表、二分查找树等)来存储和查找数据。这些数据结构提供了更快的查找时间复杂度。
  5. 并行化

    • 在多核处理器或多计算机环境下,可以并行地进行查找操作。将数据分割成多个部分,每个部分由一个处理单元同时搜索。
  6. 缓存优化

    • 对于顺序访问的列表,确保数据在物理内存中是连续的,以减少缓存未命中的次数。
  7. 算法层面的优化

    • 使用更高效的比较算法,比如对于大型整数或浮点数,可以使用更快速的比较方法。

需要注意的是,优化顺序查找的性能通常需要根据具体的应用场景和数据特点来选择合适的方法。在某些情况下,优化可能并不总是值得的,因为可能会增加代码的复杂性和维护成本。因此,在进行优化之前,需要仔细评估需求和性能要求,并确定最合适的优化策略。

3. 折半查找

折半查找,又称“二分查找”,仅适用于有序的顺序表,这是因为顺序表具有随机存储的特性,而链表没有

折半查找,是一种在有序数组中查找某一特定元素的搜索算法。其基本原理是从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中继续查找,每次查找都从中间元素开始比较。这样,每一次比较都能使搜索范围缩小一半,因此它是一种效率较高的查找方法。

使用折半查找的前提是对有序数组进行查找,其主要应用场景是查找数组中某个切实存在的数字,也可以稍微变化一些应用场景,如查找有序的字符数组中的某个字符,或者是查找某个数值所在的区间。

折半查找的过程包括建立要查找的有序数组,定义起点、中间点、终点变量和要查找的常量,然后进入查找循环,编写查找逻辑。如果在某一步骤数组为空,则代表找不到目标元素。

折半查找的效率

折半查找(二分查找)的效率非常高,其时间复杂度为O(log n),其中n是数组中的元素数量。这是因为每次查找都能将搜索范围缩小一半,所以查找次数与数组大小的对数成正比。这种高效的查找效率使得折半查找在处理大型有序数组时特别有用。

然而,值得注意的是,折半查找的前提是数组必须是有序的。如果数组无序,那么折半查找将无法进行,此时需要使用其他查找算法,如顺序查找。此外,虽然折半查找的查找效率很高,但其插入和删除操作的效率却相对较低,因为需要保持数组的有序性。

在实际应用中,如果数据量大且经常需要进行查找操作,且可以预先对数据进行排序,那么使用折半查找将是非常合适的选择。然而,如果数据量较小,或者数据的插入和删除操作频繁,那么可能需要考虑使用其他数据结构或算法来平衡查找和更新操作的效率。

4. 分块查找

分块查找,也称为块查找或索引顺序查找,是一种查找算法。它是折半查找和顺序查找的一种改进方法,特别适合于节点动态变化的情况。

分块查找的基本思想是将数据划分为多个块,并对每个块进行排序。每个块内的数据元素有序排列,而块与块之间是有序的,即第i+1块的所有记录关键字均大于(或小于)第i块记录关键字。在查找时,首先确定待查记录所在块,再在块内进行顺序查找。

分块查找的优点在于,由于只要求索引表是有序的,对块内节点没有排序要求,因此可以跳过一些不必要的块,从而提高查找效率。然而,由于需要预处理数据集,因此在数据集经常变化的情况下,它的效率可能会降低。因此,分块查找更适用于数据较多但数据不会发生变化的情况。

总之,分块查找结合了顺序查找和二分查找的优点,使得在大规模数据集中进行查找更加高效。

- 理解

  1. 折半查找过程对应的判定树一定是一棵平衡二叉树

  2. 折半查找和二叉排序树的性能比较

    1. 折半查找是二叉排序树最好的情况,复杂度O(log₂n)

    2. 二叉排序树如果形成单树,则与顺序查找相似,复杂度O(n)

  3. 对于一个长度为n的有序顺序表,如果采用折半查找一个不存在的元素,比较次数最多即为树高【log₂(n+1)】,最少即为树高减去1

  4. 计算折半查找平均失败查找时间,每个失败点的比较次数即为该点父节点的高度,即为该结点高度减一

  5. 判断空白二叉树是否是折半二叉树的办法

    1. 按照排序二叉树规则,从小到大为各空白结点标上数字

    2. 根据折半规则,判断每个树是向上折半取整还是向下折半取整、

    3. 判断各根节点是否符合折半规则、取整规则

      1. 向上取整都是优先排在左边,左子树比右子树最多多一个结点

      2. 向下取整都是优先排在右边,右子树比左子树最多多一个结点

- 技巧

  1. 顺序查找,无论是有序表还是无序表,平均查找时间相同

  2. 折半查找的判定树是一棵二叉排序树,因此,给出一定的比较值序列,如果不满足二叉排序树的规则(左<根<右)则不是折半的比较序列

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

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

相关文章

国产数据库实践:亚信安慧AntDB在DTC 2024展示创新实力

4月12至13日&#xff0c;我国数据库行业最具影响力的活动之一——第十三届『数据技术嘉年华』(DTC 2024) 在京成功举办&#xff0c;业内众多专家学者、技术领袖、各行业客户和实力厂商均到场参会。亚信安慧AntDB数据库总架构师洪建辉受邀参与“数据库一体化”专题论坛&#xff…

Stylus精讲:网页设计新境界【写作AI一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

《HCIP-openEuler实验指导手册》1.1Apache安装与测试

一、安装httpd 查看软件仓库中apache版本列表 dnf provides http 安装apache dnf install -y httpd 二、启动http并测试 查看apache版本号 httpd -v 检查配置文件是否正确 httpd -t 启动并设置为开机启动 systemctl enable httpd --now 或 systemctl enable httpd syst…

Android--ConnectivityManager使用

一、前言 Android10之后官方废弃了通过WifiManager连接WIFI的方式&#xff0c;现在要使用ConnectivityManager连接WIFI 二、连接WIFI public class MainActivity extends AppCompatActivity {private static final String TAG"lkx";Overrideprotected void onCrea…

yolov8实战第七天——pyqt5-yolov8实现车牌识别系统(参考论文(约7000字)+环境配置+完整部署代码+代码使用说明+训练好的模型)

基于 pyqt5-yolov8实现车牌识别系统,包括图片车牌识别,视频车牌识别,视频流车牌识别。 效果展示(图片检测,检测到的内容添加到历史记录): 效果展示(视频检测,视频车辆只会添加一条记录,下文更多实际应用中的优化策略): 基于YOLOv8和PyQt5的车牌识别系统设计与…

day60 接雨水 柱状图中的最大矩形

题目1&#xff1a;42 接雨水 题目链接&#xff1a;42 接雨水 题意 n个宽度为1高度不一致的柱子排列&#xff0c;可以接多少雨水 找寻当前柱子的左面第一个比该柱子高的(栈顶的下一个元素)&#xff0c;右面第一个比该柱子高的(当前遍历的元素)&#xff0c;作差 得到宽度&…

在React项目中试用Tailwind

TailwindCSS TailwindCSS 是一个套 CSS 的工具类&#xff0c;把常用的功能都进行了定义&#xff0c;下面是一个官网的例子&#xff0c;可以看到Tailwind对一元页面素写了很多类&#xff0c;日常开发中只要定义一两个类就可以搞定类似的功能了。这里写了这么多 p-6 max-w-sm mx…

java导出数据到excel表中

java导出数据到excel表中 环境说明项目结构1.controller层2.service层3.实现层4.工具类&#xff1a;ExcelUtil.java5.ProductModel.java类 使用的Maven依赖postman请求展示&#xff0c;返回内容需要前端接收浏览器接收说明&#xff08;如果下载下来的为zip类型&#xff0c;记得…

C语言读取数据检索存档《C语言程序设计》·第6章·用数组处理批量数据

C数组使用 添加链接描述 C语言读取数据检索存档 1 添加链接描述 2 添加链接描述 3 添加链接描述 4 添加链接描述 5 添加链接描述 6 添加链接描述 7 matlab转C 添加链接描述

【从浅学到熟知Linux】基础IO第三弹=>文件系统介绍、软链接与硬链接(含磁盘结构、文件系统存储原理、软硬链接的创建、原理及应用详解)

&#x1f3e0;关于专栏&#xff1a;Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 理解文件系统物理角度认识磁盘逻辑角度认识磁盘磁盘寻址磁盘中的寄存器 磁盘存储管理 软链接与硬链接软链接…

NVIDIA安装程序失败-Nsight Visual Studio Edition失败解决办法

博主是要升级cuda版本&#xff0c;那么在安装新版本之前需要卸载以前的版本。 博主一溜卸载下去&#xff0c;最后有这么个东西卸载不掉&#xff0c;Nsight Visual Studio Edition 不管是电脑系统卸载还是360卸载&#xff0c;都卸载不掉。 此时安装新的cuda也遇到了这个问题 由…

PF滤波?

粒子滤波 本文是对于原文的学习与部分的转载 https://blog.csdn.net/weixin_44044161/article/details/125445579 粒子滤波是在目标跟踪中常用的一种方法 非线性条件下&#xff0c;贝叶斯滤波面临一个重要的问题是状态分布的表达与积分式的求解 由前面章节中的分析可以得知…

拓展网络技能:利用lua-http库下载www.linkedin.com信息的方法

引言 在当今的数字时代&#xff0c;网络技能的重要性日益凸显。本文将介绍如何使用Lua语言和lua-http库来下载和提取LinkedIn网站的信息&#xff0c;这是一种扩展网络技能的有效方法。 背景介绍 在当今科技潮流中&#xff0c;Lua语言以其轻量级和高效的特性&#xff0c;不仅…

后端-MySQL-week11 事务

事务 简介 操作 有两种方式&#xff0c;一种是设置为手动提交——不执行“commit”不进行变更&#xff1b;另一种是手动开启一个事务&#xff0c;用开启事务的代码&#xff08;SQL语句&#xff09;来创建一个需要“commit”才能进行变更的事务 1.第一种方式 2.第二种方式 四…

线性代数基础3 行列式

行列式 行列式其实在机器学习中用的并不多&#xff0c;一个矩阵必须是方阵&#xff0c;才能计算它的行列式 行列式是把矩阵变成一个标量 import numpy as np A np.array([[1,3],[2,5]]) display(A) print(矩阵A的行列式是&#xff1a;\n,np.linalg.det(A))array([[1, 3],[2, …

Postman之全局变量与环境变量配置

实际开发中可能需要不停切换环境&#xff0c;接口中来回输入环境地址比较麻烦&#xff0c;故而通过定义变量来节约频繁更换测试地址所耗费的时间。Postman 允许定义自己的全局变量&#xff08;Globals&#xff09;与环境变量&#xff08;Environment&#xff09;&#xff0c;最…

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

对接浦发银行支付(五)-- 主动查询支付结果

一、背景 上一篇我们介绍了支付回调接口的对接情况&#xff0c;当回调出现网络等异常情况&#xff0c;导致用户的支付订单未及时处理或处理失败的时候&#xff0c;商户则需要自己主动向浦发银行发起查询支付结果。 主动查询支付结果&#xff0c;发挥补偿重试的重要作用&#x…

使用PHP开发体育赛事直播平台,有这些缺点和优点

"东莞梦幻网络科技"作为体育直播平台开发领域的领导者&#xff0c;选择使用PHP开发体育赛事直播平台的现成源码&#xff0c;为什么会选择该语言&#xff0c;背后的选择理由可以从该技术的优点和缺点中找到答案。 一、优点1、易学易用与快速开发&#xff1a;PHP语言语…

HTML的学习-通过创建相册WEB学习HTML-第一部分

文章目录 一、设置中文1.1、添加中文插件1.2、配置显示中文语言 二、学习开始2.1、创建项目文件夹2.2、h1标签示例&#xff1a;生成HTML框架示例&#xff1a;添加h1标签 2.3、h2标签示例&#xff1a;在h1标签下添加h2标签 2.4、h1标签到h6标签层次解析2.5、p标签示例&#xff1…