如何找到代码的上限和下限?

时间:2019-01-12 18:23:30

标签: algorithm complexity-theory

我有一些代码,文本是

对于以下代码,找到给定函数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()

1 个答案:

答案 0 :(得分:1)

您的代码格式错误,因此不清楚代码流是什么。假设您的代码实际上等效于:

for(int i=n; i>0; i/=2) {
  if(f()<=g()) {
    for(int j=f()*f(); j<n; j++) {
      f();
    }
   }
}

您需要找到最佳和最差的性能。

恕我直言,从内部到外部更容易(至少直到您获得更多经验之前):

  1. 最里面的调用f()在最坏的情况下是O(log(n)),在最好的情况下是O(1)

  2. 由于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)

  3. O(n)本身只是计算iff()的时间。由于条件大部分为真,因此我们只增加内循环的成本。因此,最坏的情况是g(),是O(log(n) + n + n*log(n));最坏的情况是O(n*log(n)),它是O(1 + log^2(n) + n)O(n)O(n)

  4. 您正确注意到的外部循环始终为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))

希望我没有弄乱细节。但是最重​​要的是要了解何时增加乘数。并了解简化后哪个部分占主导。