女孩和机器人一起思考

一起动脑筋 · 先看一个小故事

女孩把卡片数量从 10 加到 100,机器人不问“哪台电脑”,先问“检查次数增加多少”。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 逐个检查约从 10 到 100
  2. 两两比较可能约增到原来百倍
  3. 观察趋势输入越大,工作增长越快

时间复杂度描述工作量随输入规模增长的趋势。

它帮助比较算法的增长速度,而不是直接给出秒数。先理解“翻倍后发生什么”,再认识记号。

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 翻倍,主要检查次数怎样变?

想好了吗?点开看解释

大约翻倍。若没有其他更占主导的工作,通常称为线性增长。