我正在研究程序的运行时间,并且遇到了Big O表示法。要求一个人通过证明存在整数T(n)
和常数O(f(n))
来证明x
为c > 0
,以便对所有整数n >= x
,T(n) <= cf(n)
}。
我见过的例子通过“挑选”x
和c
的值来证明这一点。我了解您可以将值插入等式并查看它们是否正确,但有没有办法实际计算x
或c
?或者,至少,关于如何挑选它们的一些经验法则,这样就不会无休止地插入价值观?
答案 0 :(得分:0)
这些值来自算法T
的检查。例如,当你有一个简单的循环:
for (i=0; i < n; ++i) {
sum += i;
}
然后执行操作i<n
,++i
和sum+=i
n次,i=0
执行一次。所以f(n)==n
,c==4
(对于四个操作,将“一次”提升为“n次”以确保值的正确性),x==1
(对于n==0
,您仍然执行i=0
和i<n
,因此公式不起作用)。这为您提供了O(n)性能(输入数量的线性)。
对于嵌套循环:
for (i=0; i < n; ++i) {
for (j=0; j<n; ++j) {
sum += j;
}
}
计算类似于f(n)==n^2
,给你O(n ^ 2)。
因此,没有简洁的方法来说明c
和x
的确切值,但大部分时间难以提出f
- 根据你提供的定义,O(n ^ 2)算法也是一个O(n ^ 3)算法,但你想用O(n ^ 2)而不是O(n ^ 2)来表征该算法。为O(n ^ 3))。 f
s的排序取决于n
接近无穷大时的增长:f(n)=n^3
增长慢于f(n)=2^n
,即使前者为n
的小x
大于后者。
请注意,理论上c
和n
的实际值会随着O(n)
接近无穷大而变得无关紧要,这就是为什么它们不会显示在n
表示法中的原因本身。这并不意味着,对于f(n)
的(相对)小值,指令数量不会比{{1}}大很多(例如,for循环中有1000条指令)。
此外,O(n)表示法为您提供最差性能,可能远高于您在现实生活中观察到的(平均情况成本)或数据结构的整体使用情况(摊销成本),例如。