Algorithm 为什么这是时间复杂性分析问题的答案?

Algorithm 为什么这是时间复杂性分析问题的答案?,algorithm,data-structures,time,Algorithm,Data Structures,Time,任务说明,确定以下代码的O,Ω,Θ: void f1(int n) { int i; for (i = n; i > 0; i /= 2) { printf("%d\n", i % 2); } } 我知道循环会一直重复,直到我变成0,所以我会变成n,n/2,n/4,n/8…2/2,0 我查看了解决方案,问题的答案是O(logn),Ω(logn),Θ(logn) 为什么答案是n 非常感谢您的帮助 请注意:for循环在i==0时终止 现在,i的值通过除以2而减小,因此,让我们假设在k

任务说明,确定以下代码的O,Ω,Θ:

void f1(int n) {
 int i;
 for (i = n; i > 0; i /= 2) {
 printf("%d\n", i % 2);
 }
}
我知道循环会一直重复,直到我变成0,所以我会变成n,n/2,n/4,n/8…2/2,0

我查看了解决方案,问题的答案是O(logn),Ω(logn),Θ(logn)

为什么答案是n


非常感谢您的帮助

请注意:for循环在i==0时终止

现在,i的值通过除以2而减小,因此,让我们假设在k+1除以2之后,i的值将变为0。也就是说,循环执行了k次,然后终止

现在,在循环终止之前,可以说i=n/(2^k)

注:此处(2^k)表示2乘以k的幂

在循环终止于i==0之前,循环的最后一次执行将在i=1

因此,n/(2^k)=1

将分母移到另一边,n=(2^k)

在两侧取对数基2,log2(n)=log2(2^k)=k


因此,k=log2(n),由于k是循环执行的次数,时间复杂度为O(log2(n)),忽略常数,即基数2,O(Log(n))。

如果将n加倍,迭代次数会发生什么变化?类似地,当您在log(n)中加倍n时,它只会增加1(log到基数2)