数据结构---查找

个人介绍

hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述
🦁作者简介:一名喜欢分享和记录学习的在校大学生
💥个人主页:code袁
💥 个人QQ:2647996100
🐯 个人wechat:code8896

专栏导航

code袁系列专栏导航
1.毕业设计与课程设计:本专栏分享一些毕业设计的源码以及项目成果。🥰🥰🥰
2.微信小程序开发:本专栏从基础到入门的一系开发流程,并且分享了自己在开发中遇到的一系列问题。🤹🤹🤹
3.vue开发系列全程线路:本专栏分享自己的vue的学习历程。

非常期待和您一起在这个小小的互联网世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨ 

在这里插入图片描述

在这里插入图片描述
当涉及查找算法时,有许多不同的方法可供选择,每种方法都有其独特的特点和适用场景。以下是一篇关于查找算法的学习笔记,包括算法原理、代码示例和实际例子:


1. 线性查找(Linear Search)

算法原理:线性查找算法,也被称为顺序查找算法,是一种简单的搜索算法,用于在一个元素集合中查找特定元素的位置或确定特定元素是否存在。
它的操作非常直观,它从集合的第一个元素开始,逐一检查每个元素,直到找到目标元素或者遍历整个集合为止。

代码示例

def linear_search(arr, target):for i in range(len(arr)):if arr[i] == target:return ireturn -1# 示例
arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
target = 5
result = linear_search(arr, target)
print("目标值在列表中的索引:", result)

优缺性
(1)适用性:由于线性表有顺序存储和链式存储两种存储方式,顺序查找对这两种存储方式都适用,若对于顺序表,则通过数组的下标依次查找;对于链表,则通过指针依次查找,在链表中只能进行顺序查找。
(2)关键字比较次数:查找成功或不成功,关键字的比较次数始终是n+1次,当定位至第i个元素时,关键字的比较次数为n-i+1。由于这里采用监视哨(哨兵)的程序代码,若不采用监视哨,关键字的比较次数为n。
(3)平均查找长度:ASL成功=(n+1)/2,ASL不成功=n+1。
(4)时间复杂度:顺序查找的时间复杂度为O(n)。
(5)优缺点:顺序查找的优点是对元素的存储没有要求,可以顺序存储和链式存储,且对表内的有序性也没有要求;其缺点是当n较大时,ASL较大,导致效率低。

2. 二分查找(Binary Search)

算法原理:二分查找要求在有序列表中查找目标值,通过比较目标值和列表中间元素的大小关系,缩小查找范围。
其基本步骤如下(设查找表有n个元素):
(1)初始查找范围,置初始变量范围,low=1,high=n;
(2)取中间元素,即mid=⌊(low+high)/2⌋(向下取整,取比它小的最大整数);
(3)将指定查找的关键字与中间元素进行比较,若相等,则表示查找成功,查找的元素即为mid指向的位置;若不相等,根据大于还是小于中间元素,选择中间元素的另一边元素继续进行比较:
①若查找关键字小于中间元素,low不变,high变为mid-1;
②若查找关键字大于中间元素,high不变,low变为mid+1。
(4)重复以上(2)、(3)步骤,直到查找成功或查找范围超出(low>high)为止。
在这里插入图片描述
在这里插入图片描述

代码示例

def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1# 示例
arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
target = 13
result = binary_search(arr, target)
print("目标值在列表中的索引:", result)
```。### 3. 哈希表查找(Hash Table Search)**算法原理**:哈希表通过哈希函数将键映射到存储桶中,实现快速的查找操作。**代码示例**:
```python
# 使用Python内置的字典实现哈希表
hash_table = {'A': 1, 'B': 2, 'C': 3, 'D': 4}# 查找操作
key = 'C'
if key in hash_table:print("键'{}'对应的值为{}".format(key, hash_table[key]))
else:print("键'{}'不存在".format(key))

3. 分块查找

1、查找思想
分块查找也称为索引顺序查找,它将查找表分为若干块,要求每个块内可以无序,但块间是必须有序的,即上一块的最大关键字大于或小于后一块中的最小或最大关键字值。
另外,还需建立一个索引表,索引表内是按关键字排列有序的,索引表中的一项对应线性表的一块,索引表内由关键字域和指针域组成,前者存放该块内的最大关键字,后者存放指向该块中第一个和最后一个元素的指针(数组下标值)。

#include <stdio.h>// 定义块的结构
struct Block {int size;        // 块的大小int *data;       // 块内的数据int max;         // 块内数据的最大值(用于加速搜索)
};// 分块查找函数
int blockSearch(struct Block blocks[], int numBlocks, int target) {int blockIndex = 0;// 在每个块中进行线性查找,找到包含目标值的块while (blockIndex < numBlocks && target > blocks[blockIndex].max) {blockIndex++;}// 在找到的块中进行线性查找for (int i = 0; i < blocks[blockIndex].size; i++) {if (blocks[blockIndex].data[i] == target) {return blockIndex * blocks[blockIndex].size + i; // 返回元素的全局索引}}// 如果未找到目标值return -1;
}int main() {// 示例数据struct Block blocks[] = {{5, (int[]){1, 3, 5, 7, 9}, 9},{5, (int[]){11, 13, 15, 17, 19}, 19},{4, (int[]){21, 23, 25, 27}, 27}};int numBlocks = sizeof(blocks) / sizeof(blocks[0]);int target = 15;// 执行分块查找int result = blockSearch(blocks, numBlocks, target);if (result != -1) {printf("元素 %d 在数组中的索引是 %d。\n", target, result);} else {printf("元素 %d 不在数组中。\n", target);}return 0;
}

优缺性
1.减小查找范围: 分块查找充分利用了数据集的分块结构,可以迅速定位到包含目标元素的块,从而缩小了查找范围,减少了查找的时间复杂度。

2.适用于分布式存储: 当数据分布在多个块中,每个块都可以存储在不同的存储设备或位置上时,分块查找可以用于分布式存储系统中,提高查找效率。

3.适用于静态数据: 如果数据集是静态的,即不会频繁发生插入、删除等操作,分块查找可以更好地发挥其优势。因为在动态数据集中,频繁的插入和删除可能导致块的重新组织,增加了实现的复杂性。

4.块内线性查找: 在找到包含目标元素的块后,仍需要在该块内进行线性查找。如果块内的元素数量较大,查找效率可能不如其他更高效的算法。

5.对块的依赖性: 分块查找对于块的划分敏感,如果块的划分不合理,可能导致查找效率下降。因此,块的选择需要谨慎,并且在动态数据集中可能需要频繁调整块的划分。

6.不适用于动态数据: 在频繁发生插入和删除操作的动态数据集中,分块查找可能需要频繁地调整块的划分,导致算法复杂度增加,不如一些更适合动态数据的数据结构和算法。

🎉写在最后

🍻伙伴们,如果你已经看到了这里,觉得这篇文章有帮助到你的话不妨点赞👍或 Star ✨支持一下哦!手动码字,如有错误,欢迎在评论区指正💬~

你的支持就是我更新的最大动力💪~
在这里插入图片描述

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

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

相关文章

运 算 符

算术运算符 算术运算符包括&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff0c;&#xff0c;-- 当左右两边都是数值型时&#xff0c;则做加法运算。 当左右两边有一方为字符串&#xff0c;则做拼接运算。任何一个 Java 对象都可以转换为字符串。 …

.Net实现SCrypt Hash加密

方案1 &#xff08;加密后存储“算法设置”、“盐(随机值)”、“Hash值”&#xff0c;以“$”分隔&#xff09;&#xff1a; //Nuget引入SCrypt.NET库 using Org.BouncyCastle.Crypto.Generators; using Scrypt; using System; using System.Security.Cryptography; namespace …

MySQL 半同步复制

MySQL 半同步复制自引入以来&#xff0c;经历了多个版本的迭代和优化&#xff0c;逐步增强了其功能和性能。 MySQL 5.5&#xff1a;半同步复制首次引入。这个版本的半同步复制提供了基本的功能&#xff0c;确保了在事务提交并写入到主库的二进制日志&#xff08;binlog&#xf…

8.让画面动起来

一、Unity Shader中的内置变量&#xff08;时间篇&#xff09; 动画效果往往都是把时间添加到一些变量的计算中&#xff0c;以便在时间变化的同时也可以随之变化。Unity shader提供了一系列关于时间的内置变量来允许我们方便地在Shader中访问运行时间&#xff0c;实现各种动画…

暴雨推出X705显示器:23.8英寸100Hz IPS屏

IT资讯 6月 7 日消息&#xff0c;日前&#xff0c;暴雨发布了一款 23.8 英寸 IPS 显示器&#xff0c;直屏、支持 100Hz 刷新率。 据官方介绍&#xff0c;X705 显示器分辨率为 19201080&#xff0c;亮度为 300 尼特&#xff08;典型值&#xff09;&#xff0c;对比度 1000:1&…

从Log4j和Fastjson RCE漏洞认识jndi注入

文章目录 前言JNDI注入基础介绍靶场搭建漏洞验证注入工具 log4j RCE漏洞分析漏洞靶场检测工具补丁绕过 Fastjson RCE漏洞分析漏洞靶场检测工具补丁绕过 总结 前言 接着前文的学习《Java反序列化漏洞与URLDNS利用链分析》&#xff0c;想了解为什么 Fastjson 反序列化漏洞的利用…

量子计算的奥秘与魅力:开启未来科技的钥匙(详解)

目录 一、量子计算的基本概念 二、量子计算的基本原理 1.量子叠加态与相位态 一、概念 二、量子叠加态 定义与原理 特性与影响 应用领域 三、量子相位态 定义与原理 特性与影响 应用领域 2.量子门操作 一、概念 二、量子门操作的基本概念 三、常见的量子门操作…

关于用宽带(拨号)连接VPN无法上网,但是wifi或者热点就可以的问题

参考链接&#xff1a;https://zhuanlan.zhihu.com/p/580929250https://zhuanlan.zhihu.com/p/580929250 https://blog.csdn.net/Yaoyao2024/article/details/132245249文章浏览阅读10w次&#xff0c;点赞161次&#xff0c;收藏515次。很多同学在学习访问学校提供的资源时或者一…

Python | C++ | MATLAB机器人正逆向运动学动力学求解器及算法

&#x1f3af;求解器算法 &#x1f3af;C 计算机器人正向和逆向运动学&#xff0c;碰撞检测和可视化&#xff1a; | &#x1f3af;C运动学和动力学串行机器人建模和计算运动链 | &#x1f3af;C运动规划框架&#xff1a;逆运动学求解器&#xff0c;连接深度传感器和点云 | &am…

队列和栈的实现

文章目录 队列队列的定义队列常见的基本操作队列的顺序存储结构实现 栈栈的定义栈的常见基本操作栈的顺序存储实现 栈的链式存储实现 队列 队列的定义 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。队列是一种先…

Vitis HLS 学习笔记--聚合与解聚-AXI主接口

目录 1. 简介 2. 用法及语法 3. 详细解读 4. 总结 1. 简介 在使用 Vitis HLS 工具进行硬件设计时&#xff0c;如果你在接口上使用了结构体&#xff0c;工具会自动把结构体里的所有元素组合成一个整体。就像把一堆零件组装成一个玩具一样。这样做的好处是&#xff0c;数据可…

【西瓜书】大题

1.线性回归 思路&#xff1a;ywxb&#xff0c;w为一维数组&#xff0c;求均方误差MSE&#xff0c;对w和b分别求偏导为0得到关于w和b的闭式求解。预测第十年的代入ywxb求解即可。 2.查准率、查全率 思路&#xff1a;先计算每个算法测试结果的混淆矩阵&#xff0c;再根据混淆矩阵…

pyrouge(ROUGE-1.5.5)的安装步骤和使用说明(适用于Linux 系统)

摘要&#xff1a;本文讲解了如何配置和使用文本摘要的评价指标ROUGE(linux 系统)。 ✅ NLP 研 1 选手的学习笔记 简介&#xff1a;小王&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;摘要生成、大语言模型生成 文章目录 一、为啥要写这篇博客&…

问题汇总:MPU6050(软件iic)

以下为个人问题汇总&#xff0c;排查点汇总可能大有缺陷&#xff0c;如有错误&#xff0c;欢迎指正。 排查点汇总 检查软件iic的时序操作用示波器或逻辑分析仪检查波形 无法使用逻辑分析仪进行I/O引脚波形分析 充当SDA、SCL的引脚要配置为推挽输出; 另外&#xff0c;逻辑分…

DeepSORT(目标跟踪算法)中的解三角方程计算标准化残差(解线性方程组)

DeepSORT&#xff08;目标跟踪算法&#xff09;中的解三角方程计算标准化残差&#xff08;解线性方程组&#xff09; flyfish 《DeepSORT&#xff08;目标跟踪算法&#xff09;中的计算观测值与状态估计的马氏距离》这篇文章介绍了Cholesky 分解。Cholesky 分解将协方差矩阵分…

c++序列化和反序列化简单demo

序列化和反序列化是指将数据结构或对象转换为一种可以存储或传输的格式&#xff08;序列化&#xff09;&#xff0c;然后再将其恢复为原来的数据结构或对象&#xff08;反序列化&#xff09;。在C中&#xff0c;通常使用标准库和一些辅助库来实现序列化和反序列化。下面是一个简…

mybatis条件构造bug

一、需求背景 &#xff08;本文源自微博客,且已获得授权&#xff09; 根据传递的参数&#xff0c;使用mybatis-plus动态构造查询语句。参数对象如下&#xff1a; private Integer id;private String ip;/*** 状态:0封锁;1:已解封*/private Integer status;/*** 开始时间*…

挑战绝对不可能:再证有长度不同的射线

黄小宁 一空间坐标系中有公共汽车A&#xff0c;A中各座位到司机处的距离h是随着座位的不同而不同的变数&#xff0c;例如5号座位到司机处的距离是h3&#xff0c;…h5&#xff0c;…。A移动了一段距离变为汽车B≌A&#xff0c;B中5号座位到司机处的距离h’h3&#xff0c;…h’h5…

2002NOIP普及组真题 3. 产生数

线上OJ 地址&#xff1a; 【02NOIP普及组】产生数 核心思想&#xff1a;组合数 dfs 高精度 1、如果一个数字有 3 位&#xff0c;每位有 2种可能性&#xff0c;则数字的 组合数 为 2*2*2 8 种 。故&#xff0c;只要求出每一位数字有多少种变体即可。 求 0 ~ 9 每一个数字的…

mysql 如何分布式部署

MySQL的分布式部署是一个涉及多个步骤和配置的过程&#xff0c;以确保数据库系统能够支持大规模数据存储、高并发访问和容错性。以下是MySQL分布式部署的主要步骤和要点&#xff0c;结合参考文章中的相关信息进行整理&#xff1a; 一、前期准备 环境准备&#xff1a; 选择合…