理解
先看两个数学公式
f(n) = 4n + 1000
g(n) = 2n^2 + 5
如果使用大O来表示f函数,则为O(n);
如果使用大O来表示g函数,则为O(n^2);
所以大O是一个线性函数。小n是样本的个数。
我们在比较算法的时间复杂度的时候实际上比较的是括号内的内容是n,logn还是n^2等。
到这里有人可能会想那为什么不能直接用n,logn,n^2来表示时间复杂度呢?
n,logn,n^2只能算作一种趋势,实际上是在大多数时候我们关心的就是趋势而已,我们并不关心具体的公式是什么,所以我们把不关心也难以得知的线性部分用大O来表示,把我们关心的部分写到括号内。
这样时间复杂度的表达就兼顾了严谨和简约。
实际使用
如图是三种函数的图像,当n足够小的时候,n^2的算法时间复杂度也可能小于n,甚至logn的时间复杂度也可能大于n,这取决于O中隐含的斜率和偏移量。
所以时间复杂度只能作为一种泛化的参考,在实际选择算法时不能光看时间复杂度,要结合样本数,样本特点,并进行实验对比等(如果你的系统真的有必要做算法优化的话)。
本文灵感来自Big O, little n
数学绘制网站desmos