介绍
查找算法(Searching Algorithm),简单来说,就是在一组数据中,找到某个特定目标元素的过程和方法。
它是计算机科学中最基础、最常用的算法之一,核心任务只有一个:判断目标是否存在,如果存在,找到它的位置。
概念
查找表 (Search Table)
由同一类型的数据元素(或记录)构成的集合。
例如:数组 [5, 2, 9, 1, 5, 6]。
关键字 (Key)
数据元素中某个数据项的值,用以标识一个数据元素。
例如:我们要找的数字 9。
查找成功 / 失败
- 成功:找到关键字对应的元素,返回其位置或索引。
- 失败:表中不存在该关键字,返回特定标识(如 -1)。
常见分类
通常分为两大类:静态查找(只查不改)和 动态查找(可增删改查)。下面是最常用的几种:
顺序查找 (Sequential Search)
- 适用场景:数据无序或有序均可,对数据结构无要求(数组、链表都行)。
- 思路:从第一个元素开始,一个一个往后比对,直到找到目标或遍历结束。
- 优点:简单,无需预处理数据。
- 缺点:效率低,平均时间复杂度为 O(n)。
二分查找 / 折半查找 (Binary Search)
- 适用场景:数据必须有序,且通常是数组(支持随机访问)。
- 思路:每次取中间元素与目标比较,排除一半数据,不断缩小范围。
- 优点:效率极高,时间复杂度 O(log n)。
- 缺点:要求数据有序,插入删除麻烦。
哈希查找 (Hash Search)
- 思路:通过哈希函数,把关键字直接映射到数组下标,一步定位。
- 优点:理论上接近 O(1) 时间复杂度。
- 缺点:需要设计好哈希函数,处理哈希冲突。
树查找
- 如二叉搜索树、平衡二叉树(AVL)、红黑树、B树/B+树等。
- 适合动态数据,插入、删除、查找都比较高效。
分块查找 (Block Search)
相对不常见,介于顺序查找和二分查找之间,先分块有序,块内无序,先找块再顺序查。
对比
| 查找方式 | 时间复杂度 | 数据要求 | 典型场景 |
|---|---|---|---|
| 顺序查找 | O(n) | 无要求 | 小数据、无序、简单实现 |
| 二分查找 | O(log n) | 必须有序、支持随机访问 | 数据库块、文件系统、索引结构 |
| 哈希查找 | O(1) | 哈希函数设计好 | 有序数组、静态数据 |
提示:树的分类太多,不同种类的情况不同,这里不列举
总结
查找算法就是“在一堆数据里找东西”的标准化方法,不同算法在速度、空间、是否要求有序、是否支持动态更新上各有取舍,实际开发中根据数据规模和使用场景选择。