arrow_back返回现场笔记
OFFENSIVE 已发布 29 Jul 2026

Big O 记号:A-level 计算机科学真正的要求

A-level 计算机科学 Big O 记号的实践分解,包含实际例子和考试风格的建议。

Big O 记号出现在每份主要的 A-level 计算机科学规范中(AQA、OCR、Edexcel),它让很多学生困惑不是因为数学难,而是他们从未看到它与真实代码的结合。这是一份实践指南,说明你需要知道什么以及如何回答关于它的考试问题,而不是罗列一堆废话。

Big O 实际衡量什么

Big O 描述的是算法的运行时间(或内存使用)如何随着输入大小(通常称为 n)而增长。它不是秒数的秒表测量。这是描述增长速率的方式,这样你可以比较不同硬件上的算法。

当你写 O(n) 时,你是说:如果我将输入翻倍,工作量大约翻倍。O(n²) 意味着输入翻倍时,工作量大约是四倍。这种关系就是考官希望你识别的,而不是精确的操作计数。

你必须掌握的复杂度

对于 A-level,这些是一次又一次出现的:

  • O(1) – 常数时间。按索引访问数组元素:arr[5]。数组有多大都无关紧要。
  • O(log n) – 对数。对排序列表的二分查找。每一步都将剩余搜索空间减半。
  • O(n) – 线性。对列表的单一循环,像线性搜索那样逐个检查每项。
  • O(n log n) – 线性对数。归并排序和快速排序(平均情况)落在这里。
  • O(n²) – 二次。在相同数据上嵌套循环,这正是冒泡排序、插入排序和选择排序所做的。
  • O(2ⁿ) – 指数。没有记忆化的朴素递归斐波那契。增长快速。

你应该能够看着伪代码立即说出是其中哪一个,因为那基本上是被测试的内容。

阅读代码的复杂度

每次都有效的方法:计算循环并看它们如何与 n 相关。

# O(n) - 一个循环,一遍通过
for i in range(n):
    print(i)

# O(n^2) - 嵌套循环,都与 n 相关
for i in range(n):
    for j in range(n):
        print(i, j)

# O(log n) - 搜索空间每次迭代都减半
low, high = 0, n - 1
while low <= high:
    mid = (low + high) // 2
    if target == arr[mid]:
        break
    elif target < arr[mid]:
        high = mid - 1
    else:
        low = mid + 1

嵌套循环中,如果内循环的范围取决于 n,即使看起来略有不同(像 for j in range(i) 而不是 for j in range(n) —— 那在整体上仍然是二次的,只是常数因子有所不同),它仍然是 O(n²)。

注意根本不取决于 n 的循环。总是运行 10 次的循环,无论输入大小如何,都是 O(1),即使存在循环。考官喜欢在这方面设置陷阱。

常见排序算法及其 Big O

这是一个最喜欢的考试题目,因为它同时结合了两个规范:排序算法和复杂度。

算法最佳情况最坏情况
冒泡排序O(n)O(n²)
插入排序O(n)O(n²)
归并排序O(n log n)O(n log n)
二分查找O(1)O(log n)
线性搜索O(1)O(n)

归并排序的一致性(最佳和最坏情况相同的复杂度)如果问题问为什么你会在大数据集上选择它而不是冒泡排序,值得明确提及。冒泡排序的最佳情况 O(n) 仅当有提前退出优化时才适用,即当一遍没有发生交换时—— 如果你提到它,提出这个细节,因为一些考试委员会期望它。

学生失分的地方

最大的问题:写

本文由人工智能协助撰写,经 Michal Pilch(CISSP)审核并发布,Korra Studio。

准备好更进一步了吗?

这是来自 Korra Studio 知识库的笔记之一——该平台将每个主题与一对一指导相结合。

免费开始arrow_forward