我有一些代码,文本是
对于以下代码,找到给定函数f,g的数据的上下限,我们知道给出了最佳和最差的情况,则在大多数情况下都满足条件。
f:O(log(n)),下界为1
g:O(n),下界为(logn)^ 2
我认为我的代码的第一行是logn,然后由于n> log(n)我认为第二行是O(n * log(n)),最后一行是nlogn,我想是因为如果我使用摘要我得到logn(n +(logn)^ 2-1)结束,然后O是O(n ^ 2(logn)^ 2)。下界是n(logn)^ 3,我是初学者,所以请告诉我我在哪里出错。谢谢
for(int i=n;i>0;i/=2)
if(f()<=g())
for(int j=f()*f();j<n;j++)
f()
答案 0 :(得分:1)
您的代码格式错误,因此不清楚代码流是什么。假设您的代码实际上等效于:
for(int i=n; i>0; i/=2) {
if(f()<=g()) {
for(int j=f()*f(); j<n; j++) {
f();
}
}
}
您需要找到最佳和最差的性能。
恕我直言,从内部到外部更容易(至少直到您获得更多经验之前):
最里面的调用f()
在最坏的情况下是O(log(n))
,在最好的情况下是O(1)
。
由于f()*f()
是常量,因此内部循环是上一步(O(n)
的{{1}} 倍 )+ f()
的初始值f()
的2倍+还有j
个条件检查和O(n)
个增量,它们可以一起表示为一个O(n)
。因此,最坏的情况是O(n)
,它是O(n*log(n) + 2*log(n) + n)
;最坏的情况是O(n*log(n))
,它是O(n*1 + 2 + n)
O(n)
本身只是计算if
和f()
的时间。由于条件大部分为真,因此我们只增加内循环的成本。因此,最坏的情况是g()
,是O(log(n) + n + n*log(n))
;最坏的情况是O(n*log(n))
,它是O(1 + log^2(n) + n)
(O(n)
占O(n)
)
您正确注意到的外部循环始终为O(log^2(n))
次 。因此,总复杂度为身体的O(log(n))
次 (+不要忘记检查和增加,如果条件大部分为假,这可能会有所不同) 。因此,最坏的情况是O(log(n))
,它是O(log(n)*n*log(n)+log(n))
,最坏的情况是O(n*log^2(n))
,它是O(log(n)*n + log(n))
。
希望我没有弄乱细节。但是最重要的是要了解何时增加乘数。并了解简化后哪个部分占主导。