用
目标
- 从边集读出邻接矩阵与邻接表,并检查有向、无向存储语义;
- 比较指定边查询、邻居枚举和全图扫描的时间与空间复杂度;
- 根据图的密度和高频操作选择矩阵、邻接表、边集数组或混合索引。
前置知识
建议先阅读6.2 图的存储结构,并能区分逻辑边数
环境、输入与预期输出
- 环境:任意现代浏览器;建议准备纸笔手写矩阵或邻接表。
- 输入:本页按源文件顺序整理的 20 道四选一选择题。
- 预期输出:一份独立作答记录,以及每道错题的复杂度依据或表示选择理由。
作答方法
- 先写清图的方向、权重和底层容器,再判断复杂度;
- 点击“提交答案”后核对答案与选项辨析;
- 做错的题点击“重新作答”,并补写被忽略的实现前提;
- 完成全部题目后再查看答案总览。
题型覆盖与边界
| 类型 | 本 Lab 的处理方式 |
|---|---|
| 正常情况 | 比较矩阵、动态数组邻接表和边集数组的常见操作 |
| 边界情况 | 单独考查零权边、自环、平行边、无向边双向记录和有向图行列含义 |
| 转换情况 | 比较矩阵与邻接表的转换成本,并保留无向多重图的自环语义 |
| 易错情况 | 区分逻辑边与存储记录,并避免脱离容器类型背复杂度 |
选择题
ch06-02-q02有向图包含边
查看提示
先数指向 1 的箭头,再数从 1 出发的箭头。
ch06-02-q03一张不含自环的简单无向图有
ch06-02-q04有
ch06-02-q05对含
ch06-02-q06邻接表的每个顶点使用未排序动态数组保存出边,且没有额外索引。忽略取得表头的常数操作,最坏情况下判断指定边
查看提示
先写明“未排序动态数组、无额外索引”这个实现前提。
ch06-02-q07同一套“访问每个顶点并检查其全部邻居”的完整图遍历,使用邻接矩阵与邻接表时,时间复杂度通常分别为( )。
ch06-02-q08带权图允许权重为
ch06-02-q09下列任务最适合直接以边集数组作为主要输入表示的是( )。
ch06-02-q10一个大规模稀疏社交图既要频繁枚举用户的好友,又要频繁判断两人是否直接相连。若可以用额外空间换查询速度,下列设计最合理的是( )。
查看提示
两类高频操作可以由主存储和辅助索引分别服务。
ch06-02-q11一张不含自环的带权图使用邻接矩阵存储;随后 Floyd 算法另建距离矩阵。关于两个矩阵的主对角线,正确的是( )。
ch06-02-q12带权无向图的邻接矩阵第 u 行中有三个存在的边,权重分别为 2、5、7。顶点 u 的度为( )。
ch06-02-q13若带权邻接矩阵的每个单元只保存一个权值,依次加入两条平行边 u→v,权重分别为 4 和 9,第二次写入通常会( )。
ch06-02-q14无向图以未排序动态数组邻接表存储。删除逻辑边 {u,v} 且不维护位置索引,最坏情况下需要扫描的邻接记录量级为( )。
ch06-02-q15为使 DFS/BFS 按顶点编号稳定访问邻居,建图后把每个邻接表排序。下列说法正确的是( )。
ch06-02-q16不含自环的简单无向图的邻接矩阵可以只保存上三角区域。该优化最准确的描述是( )。
ch06-02-q17把含 n 个顶点、m 条边的邻接表转为普通邻接矩阵,先初始化 n×n 的空矩阵,再写入边。总时间复杂度为( )。
ch06-02-q18把普通 n×n 邻接矩阵转为邻接表时,即使原图很稀疏,也必须先完成的工作是( )。
ch06-02-q19无向多重图的邻接表可能含自环。若转换为每条逻辑边只出现一次的边集数组,只保留 u<v 的邻接记录会产生的问题是( )。
ch06-02-q20一张超大稀疏图构建后几乎不再修改,主要操作是顺序枚举邻居,并希望减少大量小对象的开销、改善连续访问。合适的表示起点是( )。
答案总览(建议完成全部题目后查看)
- 第 1 题:A
- 第 2 题:B
- 第 3 题:C
- 第 4 题:A
- 第 5 题:A
- 第 6 题:B
- 第 7 题:B
- 第 8 题:B
- 第 9 题:B
- 第 10 题:C
- 第 11 题:B
- 第 12 题:A
- 第 13 题:B
- 第 14 题:B
- 第 15 题:B
- 第 16 题:B
- 第 17 题:C
- 第 18 题:B
- 第 19 题:B
- 第 20 题:B
完成清单
思考题
- 为什么“邻接表查询边是
”必须附加哈希等实现前提? - 零权边存在时,怎样把“边是否存在”和“权重是多少”分开?
- 维护邻接表与哈希索引两个视图时,怎样避免更新不一致?
- 为什么把邻接表转为矩阵的成本主要由初始化矩阵决定?
复盘
- 我是否先确认了图的方向和底层容器,再套复杂度?
- 我最容易把哪一种结构的优势误认为所有操作都快?
- 哪道题最能体现“图的规模与高频操作决定存储方式”?