从比较开始
比较读取列表第一个元素与检查所有元素。列表长度加倍时,什么会发生变化?
使用课堂讲义与教材第 358–361 页复习大 O 表示法。比较时间与辅助空间如何随输入规模增长。
观察输入规模变化时,标记操作次数如何变化。
1visits = []23def growth_linear(n):4 for i in range(n):5 visits.append(i)6 return len(visits) visits 是仅用于显示工作量的记录列表。判断算法本身的辅助空间时,不应计入这些显示日志。我们统计 append 事件,而非每一步 Python 操作。
比较持续累加的总和与不断增长的输入副本。
1def auxiliary_space(items, copy_input):2 total = 03 working = []4 for value in items:5 total = total + value6 if copy_input:7 working.append(value)8 return total 给定列表占用的是输入空间。在课堂模型中,total 和 value 占用固定数量的存储位置,而副本会增长到 n 个元素。不创建副本时,辅助空间为 O(1);创建副本时为 O(n)。两种遍历的时间复杂度均为 O(n)。
比较读取列表第一个元素与检查所有元素。列表长度加倍时,什么会发生变化?
统计遍历 n 个值的单个循环、两个连续循环,以及两个嵌套循环的工作量。先尝试 n = 4 和 n = 8,再归纳规律。
将常数、对数、线性与平方增长联系到学过的算法。区分增长率与测量得到的执行时间。
比较线性搜索与二分搜索。说明所考虑的情况,解释有序输入的作用。将辅助空间与时间分开讨论。
解释为什么完整遍历列表两次仍是线性增长,而不是平方增长。
输入规模加倍时,线性算法与平方复杂度算法的工作量分别如何变化?
阅读 Baumgarten、Ganea 与 Turland 编写的《Computer Science for the IB Diploma》第 358–361 页,复习大 O 课程。下一主题:二分搜索。