当前位置: 首页 > news >正文

【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):

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

相关文章:

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

目录 1 二分查找算法 2 线性查找算法 3 哈希查找算法 1 二分查找算法 二分查找&#xff08;Binary Search&#xff09;是一种用于在有序数据集合中查找特定元素的高效算法。它的工作原理基于将数据集合分成两半&#xff0c;然后逐步缩小搜索范围&#xff0c;直到找到目标元素…...

【MySQL实战45讲-基础篇】

基础篇 基础架构 MySQL的基本架构示意图&#xff1a;MySQL可以分为Server层和存储引擎层两部分。 Server层包括连接器、查询缓存、分析器、优化器、执行器等&#xff0c;涵盖MySQL的大多数核心服务功能&#xff0c;以及所有的内置函数&#xff08;如日期、时间、数学和加密函…...

asp.net core中间件预防防止xss攻击

using System; using System.Text.Json; using System.Text.Json.Serialization;namespace CommonUtils {/// <summary>/// newtonsoft的转化器/// 防止xss攻击/// </summary>public class AntiXssNewtonsoftConverter : Newtonsoft.Json.JsonConverter<string&…...

jvm概述

1、JVM体系结构 2、JVM运行时数据区 3、JVM内存模型 JVM运行时内存 共享内存区 线程内存区 3.1、共享内存区 共享内存区 持久带(方法区 其他) 堆(Old Space Young Space(den S0 S1)) 持久代&#xff1a; JVM用持久带&#xff08;Permanent Space&#xff09;实现方法…...

C++简单上手helloworld 以及 vscode找不到文件的可能性原因

helloworld #include <iostream>int main() {std::cout << "hello world!" << std::endl;return 0; }输入输出小功能 #include <iostream> using namespace std; /* *主函数 *输出一条语句 */int main() {// 输出一条语句cout << &q…...

掌动智能:性能压力测试的重要性

采用性能压力测试可以帮助企业预估系统容量、提升用户体验以及降低风险和成本。在软件开发过程中&#xff0c;将性能压力测试纳入测试策略的重要一环&#xff0c;将为企业的成功和用户满意度打下坚实的基础。 性能压力测试的重要性&#xff1a; 一、发现性能瓶颈 性能压力测试能…...

kafka日志文件详解及生产常见问题总结

一、kafka的log日志梳理 日志文件是kafka根目录下的config/server.properties文件&#xff0c;配置log.dirs/usr/local/kafka/kafka-logs&#xff0c;kafka一部分数据包含当前Broker节点的消息数据(在Kafka中称为Log日志)&#xff0c;称为无状态数据&#xff0c;另外一部分存在…...

Linux-Centos中配置docker

1.安装yum工具 yum install -y yum-utils 2.配置yam源头 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 3.安装docker yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 4. 查看d…...

IDEA-2023-jdk8 HelloWorld的实现

目录 1 新建Project - Class 2 编写代码 3 运行 1 新建Project - Class 选择"New Project"&#xff1a; 指名工程名、使用的JDK版本等信息。如下所示&#xff1a; 接着创建Java类&#xff1a; 2 编写代码 public class HelloWorld {public static void main(S…...

【1++的Linux】之进程(五)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;什么是进程替换二&#xff0c;替换函数三&#xff0c;实现我们自己的shell 一&#xff0c;什么是进程替换 我们创建出来进程是要其做事情的&#xff0c;它可…...

用url类来访问服务器上的文件

场景一&#xff1a; package com.guonian.miaosha;import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;…...

【重拾C语言】六、批量数据组织(二)线性表——分类与检索(主元排序、冒泡排序、插入排序、顺序检索、对半检索)

目录 前言 六、批量数据组织——数组 6.1~3 数组基础知识 6.4 线性表——分类与检索 6.4.1 主元排序 6.4.2 冒泡排序 6.4.3 插入排序 6.4.4 顺序检索&#xff08;线性搜索&#xff09; 6.4.5 对半检索&#xff08;二分查找&#xff09; 算法比较 前言 线性表是一种常…...

24 Python的sqlite3模块

概述 在上一节&#xff0c;我们介绍了Python的shutil模块&#xff0c;包括&#xff1a;shutil模块中一些常用的函数。在这一节&#xff0c;我们将介绍Python的sqlite3模块。sqlite3模块是Python中的内置模块&#xff0c;用于与SQLite数据库交互。SQLite是一个轻量级的磁盘数据库…...

ARM-流水灯

.text .global _start _start: 1、设置GPIOE寄存器的时钟使能 RCC_MP_AHB$ENSETR[4]->1 0x50000a28LDR R0,0X50000A28 LDR R1,[R0] 从R0起始地址的4字节数据取出放在R1 ORR R1,R1,#(0X3<<4) 第4位设置为1 STR R1,[R0] 写回2、设置PE10、PE8、PF10管脚为输出模式 …...

【虚拟机】NAT 模式下访问外网

目录 一、NAT 模式的作用原理 二、配置 NAT 模式实现外网访问 1、配置NAT模式的网段 2、虚拟机选择 VMnet8 网卡 3、IP地址设为自动分配 一、NAT 模式的作用原理 NAT模式下&#xff0c;虚拟机的系统会把宿主机当作一个大路由器&#xff0c;发送的网络请求和数据都是先发给…...

React 入门笔记

前言 国庆值班把假期拆了个稀碎, 正好不用去看人潮人海, 趁机会赶个晚集入门一下都火这么久的 React 前端技术. 话说其实 n 年前也了解过一丢丢来着, 当时看到一上来就用 JS 写 DOM 的套路直接就给吓退了, 扭头还去看 Vue 了&#x1f923;, 现在从市场份额 社区活度来看, 确实…...

Ubuntu MySQL

在安装前&#xff0c;首先看你之前是否安装过&#xff0c;如果安装过&#xff0c;但是没成功&#xff0c;就要先卸载。 一、卸载 1.查看安装 dpkg --list | grep mysql 有东西&#xff0c;就说明您之前安装过mysql。 2.卸载 先停掉server sudo systemctl stop mysql.servic…...

大数据软件系统开发框架

大数据处理框架是用于处理大规模数据集的软件工具和平台&#xff0c;它们可以帮助分析、存储和处理庞大的数据量。以下是一些常见的大数据处理框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.A…...

rust变量

一 、变量定义 &#xff08;一&#xff09;语法格式 使用let关键字定义变量 let varname: type value; 如&#xff0c;let a: i32 78;也可以不显式指定类型 let varname value; 如&#xff0c;let a 78;一些例子 1.布尔 let t true; let f: bool false;2.整数 let a …...

蓝桥杯---第一讲 递归与递推

文章目录 前言Ⅰ. 递归实现指数型枚举0x00 算法思路0x00 代码书写0x00 思考总结 Ⅱ. 递归实现排列型枚举0x00 算法思路0x01代码书写0x02 思考总结 Ⅲ. 简单斐波那契0x00 算法思路0x01 代码书写 Ⅳ. 费解的开关0x00 算法思路0x01 代码书写 Ⅴ. 递归实现组合型枚举0x00 算法思路0…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...