注明
部分代码及言辞引用于关于big o:Θ(n)和O(n)之间有什么区别?
前言
算方需要系统性的学习,所以得概念性地了解一些基础概念,这其实是非常细节的问题,直到哪怕电流通电断电那一下所造成的开销,带来的提升意义。
概念
这三个不仅仅是计算符号,更是一种描述符号。
Oupper-bound 上界 --> the worst case --> 最坏的情况Ωlower-bound 下界 --> the best case --> 最好的情况Θexact asymptotic behavior 精确的渐近行为 --> the average case 平均情况
区分
我将提供一个简单的例子,而不是提供一个理论上的定义,这些定义已经在这里进行了精美的总结。
假设f(i)的运行时间是O(1)。下面是一个代码片段,其渐近运行时为Θ(n)。它总是调用函数f(...) n次。下限和上限都是n。
for(int i=0; i<n; i++){
f(i);
}
下面的第二个代码片段具有O(n)的渐近运行时。它最多调用函数f(...) n次。上限为n,但下限可以是Ω(1)或Ω(log(n)),具体取决于f2(i)内部发生的情况。
for(int i=0; i<n; i++){
if( f2(i) ) break;
f(i);
}