
一起动脑筋 · 先看一个小故事
女孩把卡片数量从 10 加到 100,机器人不问“哪台电脑”,先问“检查次数增加多少”。
把过程摊开来看
- 逐个检查约从 10 到 100
- 两两比较可能约增到原来百倍
- 观察趋势输入越大,工作增长越快
时间复杂度描述工作量随输入规模增长的趋势。
它帮助比较算法的增长速度,而不是直接给出秒数。先理解“翻倍后发生什么”,再认识记号。
01时间复杂度到底在量什么?
它不是直接说“程序要运行 0.2 秒”。
时间复杂度关注的是:输入规模 n 变大时,算法需要做的工作量如何增长。
02为什么不用秒来表示?
秒数会受电脑、编译器、系统负载等影响。
复杂度希望描述一种更稳定的算法增长规律。
03什么是输入规模 n?
n 由问题决定。
- 数组问题:n 常表示元素个数
- 字符串问题:n 常表示长度
- 图问题:可能同时有 V 和 E
04为什么忽略常数?
例如:
3n + 10 → O(n)
当 n 很大时,决定增长速度的是 n 这一阶,而不是前面的 3 或后面的 10。
05为什么忽略低阶项?
n² + 5n + 100 → O(n²)
n 越大,n² 项增长得远快于 n 和常数项。
06O(...) 是精确运行次数吗?
不是。
07复杂度只看最坏情况吗?
不一定。可以分析最坏、平均、最好情况。
算法题中常特别关注最坏情况,因为它能保证在允许的任何输入下都不会超出预期太多。
你已经知道了什么
- 时间复杂度描述工作量随输入规模的增长。
- 它不是实际运行秒数。
- n 表示问题的输入规模。
- 渐近分析常忽略常数倍和低阶项。
- O(...) 不是精确操作次数。
下一篇:O(1)、O(n)、O(n²) 是什么意思?
轮到你来试一试
一个算法总把 n 个数各看一遍,n 翻倍,主要检查次数怎样变?
想好了吗?点开看解释
大约翻倍。若没有其他更占主导的工作,通常称为线性增长。