【Python查找算法】二分查找、线性查找、哈希查找

目录

1 二分查找算法

 2 线性查找算法

3 哈希查找算法


1 二分查找算法

        二分查找(Binary Search)是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半,然后逐步缩小搜索范围,直到找到目标元素或确定目标元素不存在。

以下是二分查找的工作原理的详细说明: 

  1. 有序数据集合:首先,数据集合必须是有序的,通常是按升序或降序排列的。这一点非常重要,因为二分查找的核心思想是根据中间元素与目标元素的大小关系来确定搜索范围。

  2. 初始化指针:初始化两个指针,一个指向数据集合的第一个元素(左指针),另一个指向最后一个元素(右指针)。

  3. 确定中间元素:计算左指针和右指针的中间位置,即 (left + right) // 2。这将确定搜索区域的中间元素。

  4. 比较中间元素:将中间元素与目标元素进行比较:

    • 如果中间元素等于目标元素,搜索成功,返回中间元素的索引。
    • 如果中间元素大于目标元素,说明目标元素应该在左半部分,将右指针移到中间元素的左侧一位,即 right = mid - 1
    • 如果中间元素小于目标元素,说明目标元素应该在右半部分,将左指针移到中间元素的右侧一位,即 left = mid + 1
  5. 重复步骤3和4:在每次比较后,缩小搜索范围,继续比较直到找到目标元素或搜索范围为空(即左指针大于右指针)。

  6. 返回结果:如果找到目标元素,返回它的索引;如果搜索范围为空仍未找到目标元素,返回一个指示未找到的值(通常是 -1)。

以下是一个简单的示例,演示如何使用二分查找在有序数组中查找目标元素:

def binary_search(arr, target):left, right = 0, len(arr) - 1  # 初始化左右指针,分别指向数组的起始和结束位置while left <= right:  # 当左指针不大于右指针时,继续搜索mid = (left + right) // 2  # 计算中间位置if arr[mid] == target:  # 如果中间元素等于目标元素,搜索成功return mid  # 返回中间元素的索引elif arr[mid] < target:  # 如果中间元素小于目标元素,说明目标在右半部分left = mid + 1  # 移动左指针到中间元素的右侧一位else:  # 否则,目标在左半部分right = mid - 1  # 移动右指针到中间元素的左侧一位return -1  # 如果搜索范围为空仍未找到目标元素,返回 -1 表示未找到# 示例用法
sorted_list = [1, 2, 3, 4, 7, 9]
target_element = 7
result = binary_search(sorted_list, target_element)
if result != -1:print(f"元素 {target_element} 在索引 {result} 处找到。")
else:print("元素未找到。")

上述代码演示了如何使用二分查找在有序列表 sorted_list 中查找目标元素 7。根据工作原理,二分查找的时间复杂度为 O(log n),其中 n 是数据集合的大小,这使得它非常适合在大型有序数据集合中查找目标元素。

 2 线性查找算法

        线性查找(Linear Search)是一种简单的搜索算法,也称为顺序查找。它的工作原理是逐个遍历数据集合中的元素,直到找到匹配的元素或遍历整个集合。

原理:

  1. 从数据集合的第一个元素开始,逐个检查每个元素,直到找到匹配的元素或遍历整个集合。

  2. 如果找到与目标元素匹配的元素,返回该元素的索引(位置)。

  3. 如果遍历整个集合都没有找到匹配的元素,返回特定的“未找到”值(通常是 -1)。

以下是线性查找的原理示例:

数据集合: [2, 4, 7, 1, 9, 3]
要查找的元素: 7初始状态:↓
[2, 4, 7, 1, 9, 3]^第一次比较:元素 2 与目标 7 不匹配,继续下一个元素。↓
[2, 4, 7, 1, 9, 3]^第二次比较:元素 4 与目标 7 不匹配,继续下一个元素。↓
[2, 4, 7, 1, 9, 3]^第三次比较:元素 7 与目标 7 匹配,找到了目标元素。↓
[2, 4, 7, 1, 9, 3]^目标元素 7 找到在索引 2 处。

        上述示意图演示了如何使用线性查找在给定的数据集合中查找目标元素 7。算法从数据集合的第一个元素开始逐个比较,直到找到匹配的元素或遍历整个集合。

        这个示意图反映了线性查找的工作原理,即逐个遍历数据元素以寻找匹配项。如果目标元素存在于数据集合中,线性查找将找到该元素的索引。如果目标元素不存在,则遍历整个数据集合后返回特定的未找到值(通常是 -1)。

以下是一个Python线性查找示例代码:

def linear_search(arr, target):"""线性查找函数Parameters:- arr: 待查找的列表- target: 要查找的目标元素Returns:- 如果找到目标元素,返回其索引;否则返回 -1。"""for i in range(len(arr)):  # 遍历列表中的每个元素if arr[i] == target:  # 如果当前元素与目标元素匹配return i  # 返回匹配元素的索引return -1  # 如果遍历完整个列表未找到匹配元素,返回 -1 表示未找到# 示例用法
my_list = [2, 4, 7, 1, 9, 3]
target_element = 7result = linear_search(my_list, target_element)  # 调用线性查找函数if result != -1:print(f"元素 {target_element} 在索引 {result} 处找到。")
else:print("元素未找到。")

        在上述代码中,linear_search 函数用于执行线性查找。它接受两个参数:要查找的列表 arr 和目标元素 target。函数逐个遍历列表中的元素,如果找到匹配的元素,则返回匹配元素的索引;如果遍历完整个列表都没有找到匹配元素,则返回 -1 表示未找到。

        示例用法演示了如何调用 linear_search 函数来查找目标元素 7 在列表 my_list 中的位置。如果找到目标元素,程序将打印出找到的索引,否则打印 "元素未找到。"。

3 哈希查找算法

        哈希查找(Hash Search)是一种高效的搜索算法,它利用哈希函数将键映射到存储位置,并在该位置查找目标元素。哈希查找适用于快速查找和检索,特别适用于大型数据集合。以下是哈希查找的详细解释和示例:

工作原理:

  1. 哈希表:哈希查找的核心是哈希表,它是一个数据结构,由键-值对组成。哈希表内部使用哈希函数将键转换为存储位置(索引),然后将键和值存储在该位置。

  2. 哈希函数:哈希函数接受一个键作为输入,并生成一个索引(位置),通常是一个整数。好的哈希函数应该具有以下特性:

    • 对于相同的输入键,始终生成相同的索引。
    • 将不同的输入键均匀地映射到不同的索引,以减少冲突。
    • 生成的索引应尽可能分散,以降低冲突的可能性。
  3. 查找过程:要查找目标元素,哈希函数首先计算目标元素的哈希值(索引),然后在哈希表的该位置查找对应的值。如果找到匹配的值,查找成功;否则,表示未找到目标元素。

示例代码:

以下是一个使用Python的哈希查找示例代码,我们将使用字典作为哈希表来演示:

# 创建一个哈希表(字典)
my_dict = {'apple': 3, 'banana': 2, 'cherry': 5, 'date': 1, 'grape': 4}# 要查找的目标键
target_key = 'banana'# 使用哈希查找
if target_key in my_dict:value = my_dict[target_key]print(f"The value of {target_key} is {value}")
else:print(f"{target_key} not found")

        在上述示例中,我们首先创建了一个哈希表 my_dict,其中包含键-值对。然后,我们定义了要查找的目标键 target_key'banana'。通过使用哈希查找,我们可以直接访问哈希表中的值,而不需要逐个遍历整个集合。如果目标键存在于哈希表中,我们将获得与该键关联的值。

        请注意,哈希查找的效率非常高,因为它通常具有常量时间复杂度 O(1)。然而,哈希函数的设计和解决冲突的方法对算法的性能至关重要。合适的哈希函数和处理冲突的方法可以确保高效的哈希查找。

4 应用

  1. 线性查找(Linear Search):

    • 工作原理:逐个遍历数据集合,查找目标元素。
    • 应用:适用于小型无序数据集合,或当数据无序且不频繁查找时。常见于简单的列表或数组。
  2. 二分查找(Binary Search):

    • 工作原理:适用于有序数据集合,将数据集合分成两半,逐步缩小搜索范围。
    • 应用:适用于大型有序数据集合,如数组或有序列表。常见于数据库索引等高效查找场景。
  3. 哈希查找(Hash Search):

    • 工作原理:通过哈希函数将键映射到存储位置,查找时直接访问该位置。
    • 应用:适用于快速查找,如字典、散列表(哈希表)等数据结构。常用于处理大量数据的快速索引。
  4. 二叉搜索树查找(Binary Search Tree Search):

    • 工作原理:通过二叉搜索树的有序性,在左子树或右子树中查找目标元素。
    • 应用:适用于维护有序数据集合,如数据库索引、字典实现等

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

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

相关文章

ChatGPT是如何产生心智的?

一、前言 - ChatGPT真的产生心智了吗&#xff1f; 来自斯坦福大学的最新研究结论&#xff0c;一经发出就造成了学术圈的轰动&#xff0c;“原本认为是人类独有的心智理论&#xff08;Theory of Mind&#xff0c;ToM&#xff09;&#xff0c;已经出现在ChatGPT背后的AI模型上”…

[极客大挑战 2020]Roamphp2-Myblog - 伪协议+文件上传+(LFIZIP)||(LFIPhar)【***】

[极客大挑战 2020]Roamphp2-Myblog 1 解题流程1.1 分析1.2 解题1.3 中场休息——再分析1.3.1 浅层分析1.3.2 难点疑惑1.3.3 深度分析 1.4 重整旗鼓——再战1.4.1 解法一&#xff1a;zip伪协议1.4.2 解法二&#xff1a;phar伪协议 2 总结展望 1 解题流程 1.1 分析 1、点击logi…

Linux——指令初识(二)

Linux下基本指令 前言一、时间相关的指令二、Cal指令三、find指令四、grep指令五、sort指令六、uniq指令七、.zip/unzip指令八、.tar指令九、uname –r指令十、重要的几个热键[Tab],[ctrl]-c, [ctrl]-d十一、关机总结 前言 linux的学习开始啦&#xff01; 今天我们继续来认识指…

零基础自学考证HCIE分享,附零基础HCIE学习路线

最近有些粉丝问我&#xff0c;能不能自学华为认证网络工程师HCIE&#xff1f; 我的回答是&#xff1a;能&#xff0c;但是很难。 据不完全统计&#xff0c;考上HCIE的人群中自学占比10%左右。为什么会这么低呢&#xff0c;下面就来给大家说考HCIE自学会遇到的一些困难。 首先&…

Android约束布局ConstraintLayout的Guideline,CardView

Android约束布局ConstraintLayout的Guideline&#xff0c;CardView <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:a…

【java学习】一维数组(9)

文章目录 1. 一维数组声明2. 一维数组初始化3. 数组元素的引用4. 数组元素的默认初始化 1. 一维数组声明 声明方式&#xff1a; type var[] 或 type[] var 例如&#xff1a; int a[]; int[] a1; double b[]; Mydate[] c; //对象数组2. 一维数组初始化 动态初始化&#xf…

VMware和别的服务器 ,组建局域网那些事 。

利用VMware &#xff0c;实现组件局域网、有可能会受限于WiFi&#xff08;路由器&#xff09; 。 通常不会&#xff0c;除非做了网关设置 相关知识&#xff1a; 禁用局域网隔离&#xff08;LAN Isolation&#xff09;&#xff1a; 某些路由器提供了一个选项&#xff0c;允许您禁…

【面试算法——动态规划 21】不同的子序列(hard) 通配符匹配(hard)

115. 不同的子序列 给你两个字符串 s 和 t &#xff0c;统计并返回在 s 的 子序列 中 t 出现的个数&#xff0c;结果需要对 109 7 取模。 链接&#xff1a;&#xff1a;https://leetcode.cn/problems/distinct-subsequences/ 示例 1&#xff1a; 输入&#xff1a;s “rab…

【微服务】八. 统一网关gateway

8.1 网关作用介绍 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种&#xff1a; gatewayzuul Zuul是基于Servlet的实现&#xff0c;属于阻塞式编程。而SpringCloudGateway则是基于Spring5中提供的Web…

“元创新·智生成” 第15届企业数智化学习大会公布嘉宾阵容

2023年是AIGC爆发年&#xff0c;与AI相关的创新应用迅速向各行各业渗透。 在企业培训领域&#xff0c;数字人、元宇宙等正逐渐成为企业在开展人才发展、业务培训等工作的工具&#xff0c;其高效、便捷、在线化、场景化等优势受到企业的热捧。在需求的推动下&#xff0c;企业培…

springboot整合pi支付开发

pi支付流程图&#xff1a; 使用Pi SDK功能发起支付由 Pi SDK 自动调用的回调函数&#xff08;让您的应用服务器知道它需要发出批准 API 请求&#xff09;从您的应用程序服务器到 Pi 服务器的 API 请求以批准付款&#xff08;让 Pi 服务器知道您知道此付款&#xff09;Pi浏览器向…

【Java 进阶篇】CSS语法格式详解

在前端开发中&#xff0c;CSS&#xff08;层叠样式表&#xff09;用于控制网页的样式和布局。了解CSS的语法格式是学习如何设计和美化网页的关键。本文将深入解释CSS的语法格式&#xff0c;包括选择器、属性和值等基本概念&#xff0c;同时提供示例代码以帮助初学者更好地理解。…

微信小程序点单左右联动的效果实现

微信小程序点单左右联动的效果实现 原理解析&#xff1a;   点击左边标签会跳到右边相应位置&#xff1a;点击改变rightCur值&#xff0c;转跳相应位置滑动右边&#xff0c;左边标签会跳到相应的位置&#xff1a;监听并且设置每个右边元素的top和bottom&#xff0c;再判断当…

【Amazon】基于AWS云实例(CentOS 7.9系统)使用kubeadm方式搭建部署Kubernetes集群1.25.4版本

文章目录 前言实验架构介绍K8S集群部署方式说明使用CloudFormation部署EC2实例集群环境准备修改主机名并配置域名解析&#xff08;ALL节点&#xff09;禁用防火墙禁用SELinux加载br_netfilter模块安装ipvs安装 ipset 软件包同步服务器时间关闭swap分区安装Containerd 初始化集群…

Linux: alsa-lib 插件简介

文章目录 1. 前言2. 分析背景3. Linux ALSA 框架4. alsa 声卡设备5. alsa-lib 简介5.1 alsa-lib 插件5.1.1 alsa-lib 插件概览5.1.2 alsa-lib 插件工作细节5.1.2.1 插件对象的创建和初始化5.1.2.2 插件对象处理数据的过程 5.1.3 alsa-lib 内置插件代码组织5.1.4 自定义 alsa-li…

js中的原型链

编写思路&#xff1a; 简单介绍构造函数介绍原型对象原型对象、实例的关系&#xff0c;从而引出原型链的基本概念 原型链基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。 1. 什么是构造函数 构造函数本身跟普通函数一样&#xff0c;也不存在定义构造函数…

图神经网络 GNN

之前经常看到图神经网络的内容&#xff0c;但是一直都觉得很难&#xff0c;就没有继续了解&#xff0c;现在抽空学习了一下&#xff0c;简单了解GNN是个什么东西&#xff0c;还没有进行代码实践&#xff0c;随着后续的学习&#xff0c;会继续更新代码的内容&#xff0c;这里先记…

Linux动态链接库.so文件

一、动态库和静态库的区别 库是一个二进制文件&#xff0c;包含的代码可以被程序调用&#xff0c;如标准库、线程库。Windows 和 Linux下的库文件格式不兼容。 Windows环境&#xff1a;静态库是 .lib 文件&#xff0c;共享库是 .dll 文件 Linux环境&#xff1a;静态库是 .a 文…

数据结构与算法(八):排序算法

参考引用 Hello 算法 Github&#xff1a;hello-algo 1. 选择排序 选择排序的工作原理非常直接&#xff1a;开启一个循环&#xff0c;每轮从未排序区间选择最小的元素&#xff0c;将其放到已排序区间的末尾&#xff0c;设数组的长度为 n 初始状态下&#xff0c;所有元素未排序&…

HTTP协议的请求协议和响应协议的组成,HTTP常见的状态信息

HTTP协议 什么是协议 协议实际上是某些人或组织提前制定好的一套规范,大家只要都按照这个规范来就可以做到沟通无障碍 HTTP协议是W3C(万维网联盟组织)制定的一种超文本传输通信协议(发送消息的模板和数据的格式),除了传送字符串,还有声音、视频、图片等流媒体等超文本信息 …