我正在学习大O符号的运行时间和摊销时间。我理解O(n)线性时间的概念,这意味着输入的大小成比例地影响算法的增长。。。例如,二次时间O(n2)等也是如此。甚至是通过阶乘增长的算法,如置换生成器,其O(n!)次。
例如,以下函数为O(n),因为算法与其输入n成比例增长:
f(int n) {
int i;
for (i = 0; i < n; ++i)
printf("%d", i);
}
类似地,如果存在嵌套循环,时间将为O(n2)。
但O(log n)到底是什么?例如,说一个完整的二叉树的高度是O(log n)是什么意思?
我确实知道(也许不是很详细)对数是什么,从这个意义上说:log10 100=2,但我不知道如何识别具有对数时间的函数。
在信息技术中,它意味着:
f(n)=O(g(n)) If there is suitable constant C and N0 independent on N,
such that
for all N>N0 "C*g(n) > f(n) > 0" is true.
看来这个符号主要是从数学中提取出来的。
本文引用了一句话:D.E.Knuth,《大OMICRON、大OMEGA和大THETA》,1976年:
基于这里讨论的问题,我建议SIGACT以及计算机科学和数学期刊的编辑,采用上面定义的符号,除非有更好的替代方案很快就会发现。
今天是2016年,但我们今天仍然使用它。
在数学分析中,这意味着:
lim (f(n)/g(n))=Constant; where n goes to +infinity
但即使在数学分析中,有时这个符号也用于表示“C*g(n)>f(n)>0”。
我从大学里就知道,这个符号是由德国数学家朗道(1877-1938)创造的