news 2026/4/17 18:07:49

搜索算法详解:从基础到高级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
搜索算法详解:从基础到高级

一、引言
搜索算法是计算机科学中最基本、最重要的算法类别之一。它们用于在数据集合中查找特定元素、寻找最优解或探索可能的路径。搜索算法的效率直接影响程序的性能,因此在各种应用场景中都有广泛的应用,包括数据库查询、路径规划、人工智能、游戏开发等。

本文将从最简单的线性搜索开始,逐步深入探讨各种搜索算法,包括二分搜索、哈希搜索、深度优先搜索、广度优先搜索以及更高级的启发式搜索算法。每种算法都将附有详细的Python实现和实际应用示例。

二、线性搜索 (Linear Search)
2.1 基本概念
线性搜索是最直观的搜索算法,它从数据集的一端开始,按顺序检查每个元素,直到找到目标元素或遍历完整个数据集。

2.2 时间复杂度分析
最坏情况:O(n) - 需要检查所有元素

平均情况:O(n/2) ≈ O(n)

最好情况:O(1) - 目标在第一个位置

2.3 实现与优化

deflinear_search(arr,target):"""基本线性搜索实现"""fori,valueinenumerate(arr):ifvalue==target:returnireturn-1deflinear_search_with_sentinel(arr,target):"""使用哨兵的线性搜索优化"""n=len(arr)# 将目标元素放在数组末尾作为哨兵last=arr[-1]arr[-1]=target i=0whilearr[i]!=target:i+=1# 恢复原数组arr[-1]=lastifi<n-1orlast==target:returnireturn-1deflinear_search_recursive(arr,target,index=0):"""递归实现的线性搜索"""ifindex>=len(arr):return-1ifarr[index]==target:returnindexreturnlinear_search_recursive(arr,target,index+1)# 测试示例if__name__=="__main__":data=[5,2,8,1,9,3,7,4,6]# 测试基本线性搜索target=7result=linear_search(data,target)print(f"基本线性搜索: 元素{target}在索引{result}")# 测试哨兵优化result=linear_search_with_sentinel(data.copy(),target)print(f"哨兵优化搜索: 元素{target}在索引{result}")# 测试递归版本result=linear_search_recursive(data,target)print(f"递归线性搜索: 元素{target}在索引{result}")

2.4 应用场景
线性搜索虽然简单,但在以下场景中仍然有用:

小型数据集

未排序的数据集

需要一次性找到所有匹配项的情况

链表等不支持随机访问的数据结构

三、二分搜索 (Binary Search)
3.1 基本概念
二分搜索是一种在有序数组中查找特定元素的高效算法。它通过重复将搜索范围减半来工作,每次比较中间元素与目标值,然后决定继续在左半部分还是右半部分搜索。

3.2 时间复杂度分析
最坏情况:O(log n)

平均情况:O(log n)

最好情况:O(1) - 目标正好在中间

3.3 标准实现

defbinary_search_iterative(arr,target):"""迭代实现的二分搜索"""left,right=0,len(arr)-1whileleft<=right:# 防止整数溢出:mid = left + (right - left) // 2mid=(left+right)//2ifarr[mid]==target:returnmidelifarr[mid]<target:# 目标在右侧left=mid+1else:# 目标在左侧right=mid-1return-1defbinary_search_recursive(arr,target,left=0,right=None):"""递归实现的二分搜索"""ifrightisNone:right=len(arr)-1# 基准条件ifleft>right:return-1mid=(left+right)//2ifarr[mid]==target:returnmidelifarr[mid]<target:returnbinary_search_recursive(arr,target,mid+1,right)else:returnbinary_search_recursive(arr,target,left,mid-1)

3.4 变种与应用
二分搜索有多种变种,用于解决不同的问题:

defbinary_search_first_occurrence(arr,target):"""查找目标元素的第一次出现位置"""left,right=0,len(arr)-1result=-1whileleft<=right:mid=(left+right)//2ifarr[mid]==target:result=mid# 记录位置,但不停止right=mid-1# 继续在左侧搜索elifarr[mid]<target:left=mid+1else:right=mid-1returnresultdefbinary_search_last_occurrence(arr,target):"""查找目标元素的最后一次出现位置"""left,right=0,len(arr)-1result=-1whileleft<=right:mid=(left+right)//2ifarr[mid]==target:result=mid# 记录位置,但不停止left=mid+1# 继续在右侧搜索elifarr[mid]<target:left=mid+1else:right=mid-1returnresultdefbinary_search_closest(arr,target):"""查找最接近目标值的元素"""left
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 11:57:31

Java 读取 Excel 文件

Java 读取 Excel 文件一、前置准备&#xff1a;引入依赖方案 1&#xff1a;Apache POI&#xff08;功能全&#xff0c;兼容所有Excel版本&#xff09;方案 2&#xff1a;EasyExcel&#xff08;阿里开源&#xff0c;低内存&#xff0c;推荐大数据量&#xff09;二、方案 1&#…

作者头像 李华
网站建设 2026/4/16 20:02:52

棕榈酰三肽-38:一种“重建肌底”的智能淡纹成分

棕榈酰三肽-38&#xff1a;一种“重建肌底”的智能淡纹成分 棕榈酰三肽-38 Palmitoyl Tripeptide-38与常见的乙酰基六肽-8&#xff08;又称阿基瑞林&#xff09;作用机理完全不同&#xff0c;代表了抗老淡纹的另一种前沿思路。 核心机理对比&#xff1a; 乙酰基六肽-8&#xff…

作者头像 李华
网站建设 2026/4/15 5:47:12

高并发系统卡顿排查:全链路压测平台对比与瓶颈定位指南

核心观点摘要 1. 高并发系统卡顿问题普遍存在于电商、金融等行业&#xff0c;全链路压测是定位性能瓶颈的主流方案&#xff0c;可有效识别接口、数据库、缓存等环节异常。 2. 当前主流全链路压测平台分为SaaS化服务与私有化部署两类&#xff0c;分别在易用性、弹性成本和定…

作者头像 李华
网站建设 2026/4/16 1:51:04

12、使用WRT54G保障无线网络安全

使用WRT54G保障无线网络安全 1. 引言 无线网络安全多年来一直是计算机安全领域的热门话题。未受保护的无线网络很容易被攻破,这可能会泄露个人信息和计算机文件,还可能被用于攻击他人或进行其他不当活动。通过使用多层安全措施,特别是Wi-Fi受保护访问(WPA)或WPA2,可以降…

作者头像 李华
网站建设 2026/4/16 18:04:43

揭秘LoopLLM:大模型Token能耗攻击新路径,一场AI安全的新挑战!

简介 本文揭示了大模型推理过程中的"可用性攻击"威胁&#xff0c;介绍了LoopLLM框架——通过诱导模型陷入重复生成的低熵循环&#xff0c;使其无法自主终止&#xff0c;从而耗尽计算资源。实验证明&#xff0c;LoopLLM在攻击成功率(>90%)和跨模型迁移能力上显著优…

作者头像 李华
网站建设 2026/4/15 14:46:57

关于雷劈数的一些研究

一、雷劈数的定义背景&#xff1a;有个数学家走在路上看见一个 3025 的路牌被劈成 30 和 25 了&#xff0c;他发现 (3025)23025&#xff0c;因此称这种数为雷劈数。比较小的雷劈数有 81(81)2,100(100)2。雷劈数的定义大概为&#xff1a;将数 N的十进制表示从某处分成两半 a和 b…

作者头像 李华