查找的基本概念
这一节只有五个定义,但第 7 章后面每一道计算题的答案都是从这五个定义里推出来的。
整章的结构是:先给一堆查找方法,再用同一把尺子量它们。这把尺子就是
这一节还立了全章的第一条分界线:静态查找表 / 动态查找表。这条线决定了 7.2.2 折半查找 为什么不能用链表存、7.3.1 二叉排序树 为什么存在。
机制
五个定义
| 术语 | 定义 |
|---|---|
| 查找 | 在数据集合中寻找满足某种条件的数据元素的过程。结果只有两种:查找成功、查找失败 |
| 查找表 | 用于查找的数据集合,由同一类型的数据元素(或记录)组成 |
| 静态查找表 | 只涉及查找操作,无须动态修改的查找表 |
| 动态查找表 | 需要动态插入或删除的查找表 |
| 关键字 | 数据元素中唯一标识该元素的某个数据项的值 |
「查找表」是一个逻辑上的说法,不是一种存储结构。 顺序表、链表、树、散列表都可以充当查找表——这一章讲的就是用不同的结构充当查找表时,查找的代价各是多少。
静态与动态:全章的第一条分界线
| 适合的查找方法 | |
|---|---|
| 静态查找表 | 顺序查找、折半查找、散列查找 |
| 动态查找表 | 二叉排序树的查找、散列查找 |
散列查找是唯一同时出现在两栏里的。 这不是排版重复,是散列表的实质:它既能
边界辨析:
「静态 / 动态」说的是查找表要不要变,不是查找算法本身的性质。 同一个折半查找算法,用在一张永不修改的表上是静态查找,硬用在频繁增删的表上也能跑, 只是每次插入要
移动元素,代价不合算。教材说「适合」,不是说「只能」。
平均查找长度
:查找表的长度 :查找第 个数据元素的概率,一般认为等概率,即 :找到第 个数据元素所需进行的比较次数
平均查找长度是衡量查找算法效率的最主要的指标。
查找长度是比较次数,不是边数
- 不是走过的边数
- 不是层数减一
- 在判定树 / 二叉排序树上,它等于从根结点到目的结点路径上的结点数(7.2.2 判定树那一段的原话)
所以根结点的查找长度是 1 不是 0,第二层是 2 不是 1。
口径差异:
算法竞赛里习惯用「深度」「层数」描述树上位置,且常从 0 起算。 408 的查找长度一律从 1 起算,且数的是结点不是边。 手算
时若按算竞习惯从 0 数,整张表会系统性地差 1,而分子分母都被污染, 最后的分数看起来很像对的——这是最难自查出来的一类错。
成功与不成功要分开算
后面每一节都要给出两个
:在表中找到时的平均比较次数 :确认不在表中所需的平均比较次数
真正拉开各方法差距的是「不成功」那一个。 顺序查找和有序线性表的顺序查找,
看到题目只说「平均查找长度」而没说哪一个,先看它给的是不是「等概率查找表中任一元素」——是,则指成功。
手算模板
算任何一种查找方法的
- 画出这种方法的判定结构——折半查找画判定树、分块查找画索引表+块、二叉排序树就是树本身、散列表列出探测序列。
- 给每个位置标查找长度:成功看圆形结点(到它的路径上的结点数);失败看方形结点(到它父结点的路径上的结点数)。
- 加权平均:等概率时,成功除以
,失败除以失败结点个数(通常是 ,散列表是表长或散列函数的值域大小,见 7.5.4)。
第 3 步的分母最容易错:成功除
边界
| 说法 | 判断 | 说明 |
|---|---|---|
| 「查找表是一种存储结构」 | ❌ | 是逻辑上的数据集合,可用顺序表 / 链表 / 树 / 散列表实现 |
| 「静态查找表不能做查找以外的操作」 | ⚠️ | 是「无须动态修改」,不是「不允许」 |
| 「关键字可以重复」 | ❌ | 关键字唯一标识元素;可重复的叫次关键字,基于它的查找结果不唯一 |
| 「 | ❌ | 只是一般认为等概率。给了不等概率就必须按给定概率加权(2013、2020 都考过) |
| 「查找长度就是树的层数」 | ❌ | 是路径上的结点数,等于层数(层从 1 起算);从 0 起算就错了 |
| 「不成功的 | ❌ | 除以失败结点个数,一般是 |
| 「散列查找只适合静态查找表」 | ❌ | 两种都适合,是唯一横跨两栏的方法 |
对照速查
| 量 | 式子 |
|---|---|
| 平均查找长度 | |
| 等概率时 | |
| 成功的分母 | |
| 不成功的分母 | 失败结点个数(一般 |
考点
的定义式与两个变体,全章计算的地基。 - 查找长度数结点不数边、从 1 起算。
- 不成功的
分母不是 。 - 静态 / 动态的适用方法表,尤其散列横跨两栏。
- 不等概率时按给定
加权,不能默认 。
链接
- 🏠 返回总览:数据结构第 7 章:查找总览
- ➡️ 下一节:7.2.1 顺序查找与分块查找
- 🔗 判定树与两个 ASL:7.2.2 折半查找
- 🔗 动态查找表的代表:7.3.1 二叉排序树
- 🔗 横跨静态与动态:7.5.1 散列表的基本概念
- 📖 名词库:第 7 章名词库