查找算法:分类及特点

查找算法(也叫搜索算法 )是在一组数据中寻找特定目标元素的方法,根据数据结构特征查找策略,主要可分为以下几大类,每类包含典型的实现算法:

资料:https://pan.quark.cn/s/43d906ddfa1bhttps://pan.quark.cn/s/90ad8fba8347https://pan.quark.cn/s/d9d72152d3cf

一、 无序数据集合的查找算法

这类算法不要求数据提前排序,适用于未排序的数组、链表等结构,核心是遍历或哈希映射。

  1. 顺序查找(线性查找)

    • 原理:从数据集合的一端开始,逐个比较元素,直到找到目标或遍历结束。
    • 适用场景:无序数组、链表,数据量较小的场景。
    • 时间复杂度 :平均 O(n)O(n)O(n),最坏 O(n)O(n)O(n)。
    • 特点:实现简单,无需预处理数据;数据量越大效率越低。
  2. 哈希查找

    • 原理:利用哈希函数将目标元素映射到哈希表的对应位置,直接访问该位置判断是否存在。
    • 适用场景:需要高频查找、插入、删除的场景(如缓存、数据库索引)。
    • 时间复杂度 :平均 O(1)O(1)O(1),最坏 O(n)O(n)O(n)(哈希冲突严重时)。
    • 特点:预处理需要构建哈希表,空间换时间;需解决哈希冲突问题(开放寻址法、链地址法)。

二、 有序数据集合的查找算法

这类算法要求数据提前排序,通过利用有序特性减少比较次数,效率远高于顺序查找。

  1. 二分查找(折半查找)

    • 原理:将有序数组分成两部分,比较中间元素与目标值:若相等则找到;若目标值更小,则在左半部分继续查找;反之则在右半部分查找,重复此过程。
    • 适用场景:有序数组、有序静态表,不适合频繁插入删除的动态结构。
    • 时间复杂度 :O(log2n)O(log_2n)O(log2n)。
    • 变种:二分查找的下界/上界查找(找第一个大于等于目标值的元素、最后一个小于等于目标值的元素)。
  2. 插值查找

    • 原理 :是二分查找的优化版,根据目标值的预估位置 计算mid(而非固定取中间),公式为:
      mid=low+target−arrlowarrhigh−arrlow×(high−low)mid = low + \frac{target - arrlow}{arrhigh - arrlow} \times (high - low)mid=low+arrhigh−arrlowtarget−arrlow×(high−low)
    • 适用场景:数据分布均匀的有序数组(如均匀递增的数值序列)。
    • 时间复杂度 :平均 O(log log n)O(log\ log\ n)O(log log n),最坏 O(n)O(n)O(n)(数据分布极不均匀时)。
  3. 斐波那契查找

    • 原理:利用斐波那契数列的特性划分有序数组,mid 靠近黄金分割点,相比二分查找减少乘法和除法运算,适合硬件除法效率低的场景。
    • 适用场景:有序数组,嵌入式系统等对运算效率要求高的场景。
    • 时间复杂度 :O(log2n)O(log_2n)O(log2n)。

三、 树形结构的查找算法

针对树状数据结构设计的查找算法,兼顾有序性和动态插入删除的需求,是数据库、文件系统的核心查找方式。

  1. 二叉搜索树(BST)查找

    • 原理:二叉搜索树的特性为「左子树所有节点值 < 根节点值 < 右子树所有节点值」,从根节点开始比较,小于根则走左子树,大于根则走右子树,重复直到找到目标。
    • 时间复杂度 :平均 O(log n)O(log\ n)O(log n),最坏 O(n)O(n)O(n)(树退化为链表时)。
  2. 平衡二叉树查找(AVL树、红黑树)

    • 原理 :在二叉搜索树的基础上,通过自平衡机制 (旋转操作)避免树退化为链表,保证树的高度始终为 O(log n)O(log\ n)O(log n)。
    • 适用场景:需要高频动态插入、删除、查找的场景(如 Java TreeMap、C++ STL map)。
    • 时间复杂度 :O(log n)O(log\ n)O(log n)。
  3. B树/B+树查找

    • 原理:多路平衡查找树,B+树是B树的变种,所有数据都存储在叶子节点,且叶子节点通过链表相连,适合磁盘等外存数据的查找(减少磁盘IO次数)。
    • 适用场景:数据库索引(如 MySQL 索引)、文件系统(如 NTFS)。
    • 时间复杂度 :O(logmn)O(log_mn)O(logmn)(m 为树的阶数)。

四、 其他特殊查找算法

  1. 分块查找(索引顺序查找)

    • 原理:结合「顺序查找」和「二分查找」的优点,将数据分成若干块,块内无序、块间有序;先构建块的索引表(存储每块的最大值和起始位置),用二分查找确定目标所在的块,再在块内顺序查找。
    • 适用场景:数据量较大、需要分块管理的静态数据。
    • 时间复杂度 :O(n)O(\sqrt{n})O(n )。
  2. 跳表查找

    • 原理:在有序链表上建立多层「索引」,通过索引快速跳过大量节点,最终在底层链表定位目标,是一种「空间换时间」的结构。
    • 适用场景:动态有序集合(如 Redis 的有序集合 zset)。
    • 时间复杂度 :O(log n)O(log\ n)O(log n)。

查找算法分类总结表

分类 典型算法 核心特点 适用场景
无序数据查找 顺序查找、哈希查找 无需排序,哈希查找效率最高 小数据量、高频动态操作
有序数据查找 二分查找、插值查找 依赖排序,通过缩小范围提升效率 静态有序数据
树形结构查找 BST、红黑树、B+树 兼顾有序性和动态操作,适合海量数据 数据库索引、文件系统
混合查找 分块查找、跳表查找 结合多种策略,平衡效率和实现复杂度 分块管理、动态有序集合
相关推荐
weixin199701080161 分钟前
[特殊字符] 1688开放平台API Sign签名算法详解(Java / Python / PHP 实现)
java·python·算法
未若君雅裁13 分钟前
JVM 垃圾回收算法与分代回收机制
java·jvm·算法
智者知已应修善业18 分钟前
【51单片机初始化D5-D8亮,每按键按下D1到D4全亮,再按下恢复,如此循环】2024-3-26
c++·经验分享·笔记·算法·51单片机
8Qi844 分钟前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
8Qi81 小时前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
机器学习之心1 小时前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法
Tairitsu_H1 小时前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
bIo7lyA8v1 小时前
算法复杂度与能耗关系的多变量分析研究的技术8
算法
洛水水1 小时前
【力扣100题】76.搜索插入位置
数据结构·算法·leetcode
Techblog of HaoWANG2 小时前
智巡守卫:多模态巡检智能体算法服务端设计与实现——基于Ollama+Qwen3.5的自动化巡检报告生成系统
运维·人工智能·算法·目标检测·自动化·边缘计算