我在网上看到了这两个示例,我试图找出每个示例的运行时。我对这两种运行时都可能是一个猜测,但是我对第二个问题不是很肯定。
int temp=0;
int i=0;
while(temp < n){
arr[i]++;
i++;
temp = i*i;
}
我相信它的运行时是O(log n),因为while循环运行了大约n * 2次,这让我认为是这样。
int i = 0;
int j = 1;
while (j<n){
i++;
if(i==n){
i = 0;
j = j*2;
}
}
我对此的最佳猜测也是O(logn)。我真的不知道如何考虑这个问题。我知道每个子问题(进入if语句)运行n次。因此,运行时约为O(n * 3)(我认为)== O(logn)。
答案 0 :(得分:2)
第一个片段等效于:
int i=0;
while(i*i < n){
arr[i]++;
i++;
}
具有复杂性O(sqrt(n))
,因为i*i < n
与i < sqrt(n)
相同。
第二次
int i = 0;
int j = 1;
while (j<n){
i++;
if(i==n){
i = 0;
j = j*2;
}
}
让我们观察到j
在n
移至2*j
之后被重置了。如果发生这种情况k
次,则j
将成为2^k
。由于限制为n
,因此我们有2^k < n
或k < lg(n)
。总之,将有lg(n)
个j
重置,每个重置都涉及n
个步骤。因此,复杂度为O(n lg(n))
。