女孩和机器人一起思考

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

十张卡片怎么找都很快,一百万张时,检查方法的区别就明显了。

把过程摊开来看

沿着编号看一遍,再用自己的话讲一遍
  1. 顺序找可能看一百万张
  2. 有序折半每次去掉约一半
  3. 比较数关键操作,而非只看代码长度

程序耗时受算法、数据规模、实现和硬件共同影响。

先数最关键的重复操作,能看出输入变大后工作量怎样增长。短代码也可能做非常多次工作。

01同一台电脑,为什么程序速度差很多?

因为程序做的“工作量”不同。

例如找一个数:

  • 顺序查找可能看很多元素
  • 二分查找每次排除一半

02电脑更快能解决所有问题吗?

不能。

如果算法工作量从 n 增加到 n²、2^n,输入变大时增长速度可能远远超过硬件提升。

03看一个简单对比

nn2^n
10101001024
20204001,048,576
3030900约 10.7 亿

04是不是每一行代码都算一次操作?

不是。复杂度分析不会机械按“源代码行数”计算。

我们更关心关键操作随着输入规模增长的数量级。

05实际运行时间还受什么影响?

硬件

CPU、内存、缓存。

编译优化

编译器可能优化代码。

输入数据

不同输入可能走不同路径。

I/O

大量读写也可能成为瓶颈。

06为什么还要学复杂度?

因为复杂度帮助我们忽略机器细节,先判断:

输入变大时,算法工作量增长得有多快?

你已经知道了什么

  • 程序速度和算法工作量密切相关。
  • 更快硬件不能弥补所有糟糕算法。
  • 复杂度关注工作量随输入规模的增长趋势。
  • 源代码行数不等于算法操作数。
  • 真实运行时间还受硬件、I/O 和优化等因素影响。

下一篇:什么是时间复杂度?

轮到你来试一试

只有一行代码的循环,重复十亿次,会因为代码短就很快吗?

想好了吗?点开看解释

不会。代码长度不是执行次数,必须看实际重复多少次和每次做什么。