← 返回算法与AI总览 算法与AI · 知识点深化 · 时间复杂度:大O表示法与常见复杂度分析
知识点深化 · 复杂度

时间复杂度:用大 O 给算法算快慢

同样一个问题,暴力解法和聪明解法差几万倍。怎么衡量?就是时间复杂度——它不看具体几秒,只看当数据量 n 变大时,运行时间增长多快。这一页把常见复杂度排序、循环怎么数、排序算法复杂度一次理清,这是读懂所有算法的前提。

① 小白第一课怎么学(4 步走,约 50 分钟)

复杂度是衡量一个算法"跑得快不快、省不省内存"的尺子:

1看直观(10 分钟)
读第②③部分:把大 O 想象成"数据量翻 10 倍,耗时翻几倍"。
2记表(15 分钟)
背第④部分:常见复杂度排序、循环怎么数、主定理直觉。
3算例题(15 分钟)
精读第⑤部分,给几段代码数大 O。
4刷题纠错(10 分钟)
做第⑦⑩部分,错题回到第⑥部分。
本课小目标学完你要能:① 说出常见复杂度从快到慢的顺序;② 看一段代码大概估出时间复杂度;③ 区分最坏/平均/最好情况。

② 一图看懂:常见复杂度排队

时间复杂度 O(1) 常数,最快 O(log n) 二分查找 O(n) 扫一遍 O(n log n) 快排/归并 O(n²) 双重循环 O(2ⁿ) 指数 暴力枚举 大 O:只看最高阶 忽略常数和低阶 最坏/平均/最好 默认谈最坏
读法:从左到右越来越慢。绿区(log n、n)很能打,黄区(n log n)是排序的好成绩,红区(n²、2ⁿ)数据一大就崩。

③ 先认识它:大 O 就是"看数据量涨 10 倍时耗时涨几倍"

想象你要在一个电话本里找"张三":

· 翻一遍(O(n)):100 条翻 100 次,1000 条翻 1000 次——条数涨 10 倍,耗时涨 10 倍。

· 二分(O(log n)):每次折半,1000 条只要约 10 次,100 万条也只要约 20 次——涨得极慢。

· 两两比较所有组合(O(n²)):100 条 1 万次,1000 条 100 万次——涨得飞快。

大 O 不关心具体几秒(那是硬件和常数),只关心随着数据量 n 变大,增长有多快。

数据量 n → O(log n) O(n) O(n²)
大 O 只抓主要矛盾O(2n+100) 直接写成 O(n),O(n²+n+1) 写成 O(n²)。常数、低阶项都扔掉——因为当 n 很大时,最高阶项起决定作用。

④ 完整体系与公式表

常见复杂度从快到慢

复杂度n=10 时典型例子评价
O(1)1取数组第 k 个元素、哈希表查找最快
O(log n)≈3二分查找极快
O(n)10遍历一遍数组够用
O(n log n)≈33快排、归并排序排序最佳
O(n²)100冒泡/选择排序、双重循环n 大就慢
O(n³)1000三重循环、矩阵相乘很慢
O(2ⁿ)1024全子集枚举几乎不可用
O(n!)362 万全排列灾难

排序算法复杂度表

排序最好平均最坏空间
冒泡/选择O(n²)O(n²)O(n²)O(1)
快速排序O(n log n)O(n log n)O(n²)O(log n)
归并排序O(n log n)O(n log n)O(n log n)O(n)
堆排序O(n log n)O(n log n)O(n log n)O(1)
递归主定理(直觉)T(n)=a·T(n/b)+f(n) 每层把子问题分成 a 个、规模缩到 1/b;比较 a 与 b^(f 的阶)。
直觉:递归树总节点数 vs 每层额外工作量,谁大谁主导。
时间 vs 空间时间复杂度=跑多久;空间复杂度=占多少内存。两者常要权衡,比如归并排序快但要 O(n) 额外空间。

⑤ 应用场景与典型例题

例1(单层循环)for i in range(n): print(i),复杂度?
循环跑 n 次。
每轮固定操作,共 n 轮 → O(n)。
例2(嵌套循环)外层 i 跑 n 次,内层 j 也跑 n 次,复杂度?
嵌套相乘。
n×n = O(n²)。常见于冒泡排序、两两比较。
例3(折半)while n>1: n=n//2,复杂度?
每次砍一半。
n 除以 2,除到 1 要 log₂n 次 → O(log n)。二分查找就是这个。
估算口诀一层单层循环 O(n);嵌套两层 O(n²);每次折半 O(log n);分治递归合并 O(n log n)。

⑥ 高频错误诊断(4 条)

错误 1:把常数写进大 OO(2n) 必须写成 O(n),O(n/2) 也是 O(n)。大 O 忽略常数因子。
错误 2:低阶项舍不得扔O(n²+n) 就是 O(n²),n 很大时 n² 碾压 n。
错误 3:混淆最好/平均/最坏快排平均 O(n log n),但最坏(每次极不均衡)是 O(n²)。题目没说时一般谈最坏。
错误 4:以为 O(log n) 一定以 2 为底换底只是常数倍,O(log₂n)=O(log₁₀n),大 O 里不写底数。

⑦ 考点与真题演练(4 题)

考点分布

考法出题形式应对
排序给算法说复杂度记排序表
代码估算看循环数大 O嵌套相乘、折半 log
比较快慢几个复杂度排序背从快到慢

真题1. 下列哪个时间复杂度最快?

真题2. 二分查找的时间复杂度是?

真题3. 双重嵌套循环(各 n 次)的复杂度是?

真题4. 平均情况 O(n log n)、最坏 O(n²) 的排序是?

⑧ 必背公式卡

从快到慢:O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) 必背顺序
单层循环:O(n) 跑 n 次
嵌套两层:O(n²) 相乘
折半:O(log n) 二分查找
快排/归并:平均 O(n log n) 排序最佳
大 O 规则:忽略常数、低阶 只留最高阶
底数:log 不写底数,换底是常数倍 O(log n)

⑨ 应用输出:用复杂度思维选型

建模场景:在 100 万条用户记录里查某个 ID
· 方案一:从第一条线性扫到尾 → O(n)=100 万次,每次查都慢。
· 方案二:先排序再二分 → 排序 O(n log n) 一次,之后每次 O(log n)≈20 次。
· 方案三:建哈希表 → O(n) 建一次,之后每次 O(1),最快。
· 结论:查得频繁就用哈希/排序二分,别每次暴力扫。
口述训练说三句:"大 O 只看最高阶;单层 O(n)、嵌套 O(n²)、折半 O(log n);从快到慢 1、log n、n、n log n、n²。"

⑩ 分层练习 18 题(基础 6 + 中档 6 + 拔高 6)

▍基础 6 题

基础1O(3n+5) 简化为?
O(n)。
基础2O(n²+100n) 简化为?
O(n²)。
基础3数组按下标取值是?
O(1)。
基础4冒泡排序平均复杂度?
O(n²)。
基础5快排平均复杂度?
O(n log n)。
基础6O(n) 和 O(log n) 谁快?
O(log n) 快。

▍中档 6 题

中档7for i in range(n): for j in range(i,n) 复杂度?
总次数 n+(n−1)+…+1≈n²/2,仍是 O(n²)。
中档8归并排序最坏复杂度?
O(n log n),稳定。
中档9哈希表查找平均复杂度?
O(1)。
中档10O(n³) 和 O(2ⁿ) 谁更慢?
O(2ⁿ) 慢得多,指数爆炸。
中档11时间复杂度和空间复杂度区别?
时间=跑多久,空间=占多少内存。
中档12快排最坏复杂度?什么时候?
O(n²),每次选的基准极不均衡(如已排序数组)。

▍拔高 6 题

拔高13T(n)=2T(n/2)+O(n) 的复杂度?
归并式,O(n log n)。
拔高14T(n)=T(n/2)+O(1) 的复杂度?
二分式,O(log n)。
拔高15堆排序空间复杂度?
原地排序,O(1)。
拔高16n=10⁶,O(n²) 算法大约要多少次?
10¹² 次,根本跑不完——这就是为什么不能暴力。
拔高17最好 O(n log n)、最坏 O(n²)、空间 O(1) 的排序?
堆排序(最坏也 n log n,空间 O(1))。
拔高18为什么大 O 忽略常数和低阶?
n→∞ 时最高阶项主导增长,常数和低阶对增长趋势无影响。

⑪ 记忆口诀 + 7 天复习计划

三句口诀 ① 大 O 只看最高阶,常数低阶全扔掉。
② 单层 n、嵌套 n²、折半 log n,排序最好 n log n。
③ 从快到慢记一遍:1、log n、n、n log n、n²、2ⁿ。
天任务自检
第 1 天读②③④,背复杂度排序按快慢排对
第 2 天背排序表 + 基础 1-6常见排序不混
第 3 天做中档 7-12会估循环复杂度
第 4 天做拔高 13-18认识主定理直觉
第 5 天做⑦真题 4 题限时每题 2 分钟
第 6-7 天合上书口述三句口诀不看资料全说对

← 返回算法与AI总览