【问题标题】:How to find a upper and lower bound of code?如何找到代码的上限和下限?
【发布时间】:2019-01-13 08:47:36
【问题描述】:

我有一些代码,文字是

对于下面的代码,如果给定函数 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()

【问题讨论】:

    标签: algorithm complexity-theory


    【解决方案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) 上一步(即f())+ 2 次@987654329 @ 对于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)

    3. 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))

    4. 您正确注意到的外部循环始终是O(log(n))。所以总复杂度是主体的O(log(n)) times(+ 不要忘记检查和增量,如果条件大部分为假,这可能会有所不同)。所以最坏的情况是O(log(n)*n*log(n)+log(n)),即O(n*log^2(n)),最好的情况是O(log(n)*n + log(n)),即O(n*log(n))

    希望我没有搞砸细节。但最重要的是要了解何时相加和何时相乘;并在简化时了解哪个部分支配其他部分。

    【讨论】:

    猜你喜欢
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多