我需要找到以下代码的最接近的上下限。我是初学者,对此我感到抱歉。
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();
答案 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))
。