数据结构篇--顺序查找【详解】

news2024/12/24 11:45:07

概念章

查找就是在数据集合中寻找某种条件的数据元素的过程。

查找表是指用于查找同一类型的数据元素集合

找到了满足条件的数据元素,就是查找成功,否则就是称为查找失败

关键字是指数据元素的某个数据项的值,可用于标识或者记录,一般我们只指一个。  

静态查找表是指一个查找表操作仅仅涉及查找操作,简单来说就只是看看,不动态修改查找表。

动态查找表是指对这个查找表的操作设计查找,还要动态的插入和删除查找表。

平均查找长度(Average Search Length)简称为:ASL 是指查找表中每个数据元素需要进行关键字比较次数的平均值。

简单来说,上面的概念都是围绕ASL(平均查找长度)展开的,它的重点也就是两个方面:查找成功和查找失败的平均查找长度。

也就是上面这个公式。

感觉有点模模糊糊的没看太懂?

我们从一道简单的题中来近距离理解平均查找长度的概念。

例子

假设我们有一个有序数组,包含以下元素:

[10, 20, 30, 40, 50]

查找成功的平均查找长度(ASL成功)

假设我们查找的目标是数组中的元素,且每个元素被查找的概率是相等的。

  • 查找10:比较1次
  • 查找20:比较2次
  • 查找30:比较3次
  • 查找40:比较4次
  • 查找50:比较5次

计算查找成功的平均查找长度(ASL成功):

[ ASL_{成功} = (1 + 2 + 3 + 4 + 5) / 5 = 15 / 5 = 3 ]

查找失败的平均查找长度(ASL失败)

现在考虑查找一个不在数组中的元素,比如25。为了理解查找失败的平均查找长度,我们需要考虑在查找失败的情况下,需要比较多少次。

对于25,查找过程中会经历:

  • 比较10,20,30(3次比较),然后确认25不在数组中。

假设每个元素前后都可能是目标元素,每个元素查找失败的概率也相同。这里我们可以想象在数组的前后各加一个元素(如5和60),以简化计算。

所以失败查找的情况可以如下:

  • 查找5:比较1次(确定5小于10)
  • 查找15:比较2次(确定15在10和20之间)
  • 查找25:比较3次(确定25在20和30之间)
  • 查找35:比较4次(确定35在30和40之间)
  • 查找45:比较5次(确定45在40和50之间)
  • 查找55:比较6次(确定55大于50)
  • 查找60:比较6次(确定60大于50)

我们可以假设失败查找有7个情况,每种情况所需的比较次数为:

[ ASL_{失败} = (1 + 2 + 3 + 4 + 5 + 6 + 6) / 7 = 27 / 7 = 3.86(约等于)


概念说完之后,我们来说说最简单的一个查找:顺序查找。

顺序查找

顺序查找又称为线性查找,用于顺序表和链表

基本思想就是从表头遍历到表尾,直到查找成功或查找失败。

具体来说:

例子

假设我们有一个有序数组,包含以下元素:

[100,1000,8,15,200],我们要在一个长度为5的顺序表中查找元素8.

顺序查找的源代码如下

#include<stdio.h>
#define MaxSize 100
int SeqSearch(int array[], int n, int key) {
	for (int i = 0; i < n; i++) {
		if (array[i] == key) {
			return i;//查找成功则返回其元素下标
		}
	}
	return -1;//查找失败则返回-1
}
	int main() {
		int array[MaxSize] = { 100,1000,8,15,200 };
			int n = 5;
			int res = SeqSearch(array, n, 8);
			printf("查找结果为: %d", res);
			return 0;
}

实现截图:

由此图也可知,代码逻辑没错

同样的,我们也可以将数组元素从下标为1的地方开始存储,然后在下标为0的这里存储待查找的关键字,也可以称为哨兵

哨兵

将哨兵放在数组头也是一种有效的查找策略,尽管它不如放在尾部常用。使用头部哨兵的主要思路是为了简化查找逻辑。

实现思路

  1. 设置哨兵:在数组的开头放置一个哨兵值,这个值通常是比数组中所有元素都小(或大)的值。
  2. 查找过程:从哨兵开始向后查找目标值,直到找到目标值或达到数组的末尾。

优点

  • 避免边界检查:因为哨兵在数组的开头,所以在查找过程中不需要检查下标是否小于零。
  • 简化逻辑:减少代码中的条件判断,使代码更简洁。

示例

假设我们有数组 [10, 20, 30, 40, 50],我们在头部添加一个哨兵值(例如,0):

[0, 10, 20, 30, 40, 50]

查找目标值(例如30)时,过程如下:

  1. 从哨兵(0)开始,与30比较。
  2. 继续向后查找,比较10,20,直到找到30。
  3. 当找到目标时,可以返回目标值的位置,或继续查找直到遇到哨兵。

注意事项

  • 使用头部哨兵时,实际查找时需要注意哨兵本身并不代表有效数据,所以在返回结果时需要进行相应处理。
  • 哨兵值的选择应确保其不会与数组中的其他元素相同,以避免混淆。

同样的,哨兵也可以放在数组末尾。

哨兵是一种特殊的元素,通常放在数组的末尾,用于避免边界检查。具体来说,当我们查找目标元素时,将目标值与哨兵值进行比较,直到找到目标或到达哨兵。

优点

  1. 减少比较次数:不需要在每次比较时检查下标是否越界。
  2. 简化代码:使得代码逻辑更清晰。

示例

假设有数组 [10, 20, 30, 40, 50],我们在末尾添加一个哨兵值(比如60):

 

复制代码

[10, 20, 30, 40, 50, 60]

查找目标值(例如30)时,直接比较目标值和哨兵,直到找到目标或遇到哨兵。

前面我们不是提到了平均查找长度吗,结合顺序查找->

当然,要注意如果查找表的元素是有序的,我们就没必要遍历整个查找表。当发现我们拿到的数据元素比关键字(key)大时,我们就没必要继续往后遍历了。

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

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

相关文章

【Java】线程暂停比拼:wait() 和 sleep()的较量

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持&#xff01; 在Java多线程编程中&#xff0c;合理地控制线程的执行是至关重要的。wait()和sleep()是两个常用的方法&#xff0c;它们都可以用来暂停线程的执行&#xff0c;但它们之间存在着显著的差异。本文将详…

【AI学习笔记】初学机器学习西瓜书概要记录(二)常用的机器学习方法篇

初学机器学习西瓜书的概要记录&#xff08;一&#xff09;机器学习基础知识篇(已完结) 初学机器学习西瓜书的概要记录&#xff08;二&#xff09;常用的机器学习方法篇(持续更新) 初学机器学习西瓜书的概要记录&#xff08;三&#xff09;进阶知识篇(待更) 文字公式撰写不易&am…

Django 基础之启动命令和基础配置

Django启动 django启动一般可以通过ide或者命令启动 ide启动&#xff1a; 启动命令&#xff1a; python manage.py runserver该命令后续可以增加参数&#xff0c;如&#xff1a; python manage.py runserver 8081 python manage.py runserver 127.0.0.1:8082 注意&#xff1…

StopIteration: 迭代停止完美解决方法 ️

&#x1f504; StopIteration: 迭代停止完美解决方法 &#x1f6e0;️ &#x1f504; StopIteration: 迭代停止完美解决方法 &#x1f6e0;️摘要引言正文1. 什么是StopIteration异常&#xff1f;&#x1f4dc;2. StopIteration在for循环中的处理机制&#x1f6a6;3. 如何自定…

数仓规范:命名规范如何设计?

目录 0 前言 1 表命名规范 2 字段命名规范 3 任务命名规范 4 层级命名规范 5 自定义函数命名规范 6 视图和存储过程的命名规范 7 综合案例分析 8 常见陷阱和如何避免 9 工具和最佳实践 10 小结 想进一步了解数仓建设这门艺术的&#xff0c;可以订阅我的专栏数字化建设…

深度学习02-pytorch-03-张量的数值计算

张量&#xff08;Tensor&#xff09;是多维数组的通用化概念&#xff0c;它可以表示标量&#xff08;0维&#xff09;、向量&#xff08;1维&#xff09;、矩阵&#xff08;2维&#xff09;以及更高维度的数据。在深度学习和数值计算中&#xff0c;张量是基础数据结构&#xff…

[Python学习日记-27] 文件操作练习题解析

[Python学习日记-27] 文件操作练习题解析 简介 练习题1——全局替换程序 练习题2——模拟登陆 简介 练习题1——全局替换程序 一、题目 写一个脚本&#xff0c;允许用户按以下方式执行时填入参数&#xff0c;即可以对指定文件内容进行全局替换 python your_script.py old…

Mybatis in用法优化

如果in的参数过多&#xff0c;mybatis会报错 原来写法&#xff1a;select * from file_inf a <where>and a.status 0 and a.id in<foreach collection"ids" open"(" close")" separator"," item"id" #{id}</for…

ConflictingBeanDefinitionException | 运行SpringBoot项目时报错bean定义冲突解决方案

具体报错&#xff1a; Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name ‘CommissionMapperImpl’ for bean class [com.xxx.mapper.carrier.CommissionMapperImpl] conflicts with existing, non-co…

MAC激活Typora以及禁止成功激活弹窗的方法

激活 Typora 首先在官网下载 Typora 的最新版 并且安装。 打开以下目录 /Applications/Typora.app/Contents/Resources/TypeMark/page-dist/static/js/ 注意在 Applications 中&#xff0c;需要对 Typora 右键选择 Show Packages Contents 即可进入 Typora.app。 在该目录的文…

探索未来智能:Moonshot AI 引领AI新纪元——M1超级模型

在人工智能的快速演进中&#xff0c;Moonshot AI再次站在了技术创新的前沿。推出M1超级模型&#xff0c;这是一款旨在突破现有AI能力极限的革命性产品。 M1超级模型的诞生背景 随着数据量的爆炸性增长和计算能力的提升&#xff0c;AI模型正变得越来越复杂和强大。M1超级模型…

华为HarmonyOS地图服务 1 -- 如何实现地图呈现?

如何使用地图组件MapComponent和MapComponentController呈现地图&#xff0c;效果如下图所示。 MapComponent是地图组件&#xff0c;用于在您的页面中放置地图。MapComponentController是地图组件的主要功能入口类&#xff0c;用来操作地图&#xff0c;与地图有关的所有方法从此…

从规范到实现解读Windows平台如何播放RTSP流

RTSP播放器应用场景 RTSP播放器在视频监控、远程视频会议、网络电视、实时流媒体传输、协同操控相关的智能设备、教育培训以及企业内部通讯与协作等多个领域都有着广泛的应用场景。 1. 视频监控 RTSP直播播放器在视频监控系统中扮演着重要角色。通过RTSP协议&#xff0c;播放…

Java—SPI 机制详解

参考文章 Java常用机制 - SPI机制详解 | Java 全栈知识体系包含: Java 基础, Java 部分源码, JVM, Spring, Spring Boot, Spring Cloud, 数据库原理, MySQL, ElasticSearch, MongoDB, Docker, k8s, CI&CD, Linux, DevOps, 分布式, 中间件, 开发工具, Git, IDE, 源码阅读&a…

安全带检测系统源码分享

安全带检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

OpenCV基础入门30讲(Python)——第三讲 图像对象的创建与赋值

在OpenCV里&#xff0c;对图像的操作是最为基本的。接下来我们看一下图像对象的创建与赋值。 注&#xff1a;前文介绍过的代码和操作不再重复。 代码 在 main 文件中&#xff0c;先导入新的模块 # 导入 numpy 模块&#xff0c;重命名为 np import numpy as np 再写进以下代…

一条龙小程序开发教程

初次上手 微信小程序已经成为国内前端的一个重要业务&#xff0c;跟 Web 和手机 App 有着同等的重要性。小程序开发者供不应求&#xff0c;市场招聘需求极其旺盛&#xff0c;企业都抢着要。 尽管如此&#xff0c;小程序的教程却很缺&#xff0c;要么是不够系统&#xff0c;要么…

Python 从入门到实战24(类的继承)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了类的定义、使用方法、property的相关知识。今…

PHP API 框架:构建高效API的利器

在当今快速发展的互联网时代&#xff0c;API&#xff08;应用程序编程接口&#xff09;已成为连接不同应用程序和服务的关键。PHP&#xff0c;作为一种流行的服务器端脚本语言&#xff0c;提供了多种强大的框架来简化API的开发。本文将介绍PHP API框架的重要性&#xff0c;以及…

嵌入式系统基础讲解

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 嵌入式系统是计算机科学与电子工程的交叉领域&#xff0c;广泛应用于消费电子、工业控制、汽车、医疗设备等多个行业。嵌入式系统设计涉及硬件和软件的协同开发&#xff0c;要求开发者掌握多方面的基础知识。…