线性复杂度
根据摩尔定律的估计,每 18 个月计算机的运算与存储能力均增加一倍。过去几十年计算机硬件性能的提升很好地印证了这一规律。若不加仔细思考,摩尔定律提供给我们的似乎是一个乐观的期待,即,对于一个固定的软件算法,每经过 18 个月因为它的运行速度会快一倍,所以软件的运行时间也会减半。但实际并非如此!因为随着计算机硬件能力的提升,我们期望用该软件算法去解决的问题规模也是在增长的,其增长速度与计算机存储能力的增长相同——这是因为我们希望充分利用计算机的所有硬件资源为我们服务,而不是让其有所空闲。这就意味每经过 18 个月,我们实际需要解决问题的规模也会翻倍。
假设我们算法的时间复杂度为 \(O(n^2)\),空间复杂度为 \(O(n)\),再同时考虑计算机硬件速度的提升与问题规模的增加,18 个月后该算法的实际运行时间将会是当下的 2 倍,也就是说反而变慢了。如果算法的空间复杂度比 \(O(n)\) 还要差,则情况会更糟。这个定性分析与我们的实际感受也是一致的:虽然我们的手机与个人电脑的性能相较十几年前有了大幅提升,但是诸如浏览的图片、观看的视频的分辨率和相应的数据量也大大增加了,所以我们并未觉得手机或电脑在处理这些日常任务的时候比往常快多少(参考安迪-比尔定律)。
稍加思考我们便可知,只有当算法的复杂度为线性即 \(O(n)\) 或者优于线性,例如准对数 \(O(n\log n)\) 或者对数 \(O(\log n)\) 复杂度,才能够保证随着时间的推移,该算法在用户实际的使用中不会越来越慢。只有基于这样的算法写出的软件才具有生命力和市场价值,而不是在市场上坛花一现,或者仅能用来做技术演示和教学。