查找算法(也叫搜索算法 )是在一组数据中寻找特定目标元素的方法,根据数据结构特征 和查找策略,主要可分为以下几大类,每类包含典型的实现算法:
资料:https://pan.quark.cn/s/43d906ddfa1b、https://pan.quark.cn/s/90ad8fba8347、https://pan.quark.cn/s/d9d72152d3cf
一、 无序数据集合的查找算法
这类算法不要求数据提前排序,适用于未排序的数组、链表等结构,核心是遍历或哈希映射。
-
顺序查找(线性查找)
- 原理:从数据集合的一端开始,逐个比较元素,直到找到目标或遍历结束。
- 适用场景:无序数组、链表,数据量较小的场景。
- 时间复杂度 :平均 O(n)O(n)O(n),最坏 O(n)O(n)O(n)。
- 特点:实现简单,无需预处理数据;数据量越大效率越低。
-
哈希查找
- 原理:利用哈希函数将目标元素映射到哈希表的对应位置,直接访问该位置判断是否存在。
- 适用场景:需要高频查找、插入、删除的场景(如缓存、数据库索引)。
- 时间复杂度 :平均 O(1)O(1)O(1),最坏 O(n)O(n)O(n)(哈希冲突严重时)。
- 特点:预处理需要构建哈希表,空间换时间;需解决哈希冲突问题(开放寻址法、链地址法)。
二、 有序数据集合的查找算法
这类算法要求数据提前排序,通过利用有序特性减少比较次数,效率远高于顺序查找。
-
二分查找(折半查找)
- 原理:将有序数组分成两部分,比较中间元素与目标值:若相等则找到;若目标值更小,则在左半部分继续查找;反之则在右半部分查找,重复此过程。
- 适用场景:有序数组、有序静态表,不适合频繁插入删除的动态结构。
- 时间复杂度 :O(log2n)O(log_2n)O(log2n)。
- 变种:二分查找的下界/上界查找(找第一个大于等于目标值的元素、最后一个小于等于目标值的元素)。
-
插值查找
- 原理 :是二分查找的优化版,根据目标值的预估位置 计算mid(而非固定取中间),公式为:
mid=low+target−arr[low]arr[high]−arr[low]×(high−low)mid = low + \frac{target - arr[low]}{arr[high] - arr[low]} \times (high - low)mid=low+arr[high]−arr[low]target−arr[low]×(high−low) - 适用场景:数据分布均匀的有序数组(如均匀递增的数值序列)。
- 时间复杂度 :平均 O(log log n)O(log\ log\ n)O(log log n),最坏 O(n)O(n)O(n)(数据分布极不均匀时)。
- 原理 :是二分查找的优化版,根据目标值的预估位置 计算mid(而非固定取中间),公式为:
-
斐波那契查找
- 原理:利用斐波那契数列的特性划分有序数组,mid 靠近黄金分割点,相比二分查找减少乘法和除法运算,适合硬件除法效率低的场景。
- 适用场景:有序数组,嵌入式系统等对运算效率要求高的场景。
- 时间复杂度 :O(log2n)O(log_2n)O(log2n)。
三、 树形结构的查找算法
针对树状数据结构设计的查找算法,兼顾有序性和动态插入删除的需求,是数据库、文件系统的核心查找方式。
-
二叉搜索树(BST)查找
- 原理:二叉搜索树的特性为「左子树所有节点值 < 根节点值 < 右子树所有节点值」,从根节点开始比较,小于根则走左子树,大于根则走右子树,重复直到找到目标。
- 时间复杂度 :平均 O(log n)O(log\ n)O(log n),最坏 O(n)O(n)O(n)(树退化为链表时)。
-
平衡二叉树查找(AVL树、红黑树)
- 原理 :在二叉搜索树的基础上,通过自平衡机制 (旋转操作)避免树退化为链表,保证树的高度始终为 O(log n)O(log\ n)O(log n)。
- 适用场景:需要高频动态插入、删除、查找的场景(如 Java TreeMap、C++ STL map)。
- 时间复杂度 :O(log n)O(log\ n)O(log n)。
-
B树/B+树查找
- 原理:多路平衡查找树,B+树是B树的变种,所有数据都存储在叶子节点,且叶子节点通过链表相连,适合磁盘等外存数据的查找(减少磁盘IO次数)。
- 适用场景:数据库索引(如 MySQL 索引)、文件系统(如 NTFS)。
- 时间复杂度 :O(logmn)O(log_mn)O(logmn)(m 为树的阶数)。
四、 其他特殊查找算法
-
分块查找(索引顺序查找)
- 原理:结合「顺序查找」和「二分查找」的优点,将数据分成若干块,块内无序、块间有序;先构建块的索引表(存储每块的最大值和起始位置),用二分查找确定目标所在的块,再在块内顺序查找。
- 适用场景:数据量较大、需要分块管理的静态数据。
- 时间复杂度 :O(n)O(\sqrt{n})O(n )。
-
跳表查找
- 原理:在有序链表上建立多层「索引」,通过索引快速跳过大量节点,最终在底层链表定位目标,是一种「空间换时间」的结构。
- 适用场景:动态有序集合(如 Redis 的有序集合 zset)。
- 时间复杂度 :O(log n)O(log\ n)O(log n)。
查找算法分类总结表
| 分类 | 典型算法 | 核心特点 | 适用场景 |
|---|---|---|---|
| 无序数据查找 | 顺序查找、哈希查找 | 无需排序,哈希查找效率最高 | 小数据量、高频动态操作 |
| 有序数据查找 | 二分查找、插值查找 | 依赖排序,通过缩小范围提升效率 | 静态有序数据 |
| 树形结构查找 | BST、红黑树、B+树 | 兼顾有序性和动态操作,适合海量数据 | 数据库索引、文件系统 |
| 混合查找 | 分块查找、跳表查找 | 结合多种策略,平衡效率和实现复杂度 | 分块管理、动态有序集合 |