找到以下代码的上限

时间:2019-01-14 07:21:42

标签: algorithm complexity-theory

我需要找到以下代码的最接近的上下限。我是初学者,对此我感到抱歉。

p()的上限为O(log(n)),下限为O(1)

notp()的上限为O(log(n)),下限为O(1)

我认为下界是O(1),因为如果我有n = 4,那么我会进入循环,并且由于n%i == 0,所以我叫p(),它注意到这不是素数,所以O (1)然后由于i = 2,其他notp将不会执行。那是最糟糕的情况。

最糟糕的情况是我循环执行log(n),然后执行ap,上限是O(log(n)),所以它是O(log(n)^ 2),但我不是这样确定这很好,请告诉我我在哪里犯了错误?

int i;
for (i = 2; i*i <= n; i++) {
  if (n % i == 0) {
    p();
    break;
  }
}
if(i*i > n)
  notp();

2 个答案:

答案 0 :(得分:2)

对于订单计算,通常会在出现循环时将它们相乘。

     { command: [{name: "Delete", iconClass:"k-icon k-i-close", 
            click: function(e) {
            e.preventDefault(); 
            var tr = $(e.target).closest("tr"); 
            var data = this.dataItem(tr); 

            kendo.confirm("Are you sure that you want to delete this record?").then(function () {
            grid.dataSource.remove(data) //prepare a "destroy" request
            grid.dataSource.sync() 
            });
            }        
        }
    ]}

那将是O(n),因为循环是单个情况。

嵌套循环为

for( i = 0; i < n ; i++ ){
     DoSomething(i);
}

随着它们的加法,它变为O(n ^ 2)。

如果您有非嵌套循环...

for( i = 0; i < n ; i++ ){ 
    for( j =0; j < n; j++ ){
       DoSomething(i,j);
    }
}

则O(x)是最大项。这是因为对于非常大的n而言,x的较小值无关紧要。

因此,您遇到一个循环,即O(sqrt(n))。那是因为它受到i * i小于n的限制。

然后将调用p()或notp()之一。

(我认为p()和notp()是错误的方法)。

重构代码。...

for( i = 0; i < n ; i++ ){
     DoSomething(i);
}


for( j = 0; j < sqrt(n) ; j++ ){
     DoSomething(j);
}

所以我们有O(sqrt(n))时间,加上p / notp函数之一,即O(log(n))

O(sqrt(n)+ log(n))

当sqrt的增长速度快于n时,它将压倒log(n)wikipedia Big O,将其保留为最终值。

O(sqrt(n))

答案 1 :(得分:1)

由于循环的终止条件为i*i <= n,因此循环的最大可能迭代次数为sqrt(n)。由于在break的情况下存在n % i == 0,因此这部分的最坏情况是sqrt(n) + log(n),即O(sqrt(n))。同样,第二个条件是否成立,因为nopt()的最坏情况是O(log(n)),所以该算法的最坏情况总计是O(sqrt(n))