Big o 嵌套循环的大O(int j=0;j<;i;j+;+;) for(int i=n;i>0;i/=2){ 对于(int j=0;j0;I/=2)的第一个循环导致O(logn)
我知道,Big o 嵌套循环的大O(int j=0;j<;i;j+;+;) for(int i=n;i>0;i/=2){ 对于(int j=0;j0;I/=2)的第一个循环导致O(logn),big-o,Big O,我知道,for(inti=n;I>0;I/=2)的第一个循环导致O(logn) (int j=0;j
for(inti=n;I>0;I/=2)
的第一个循环导致O(logn)
(int j=0;j的第二个循环依赖于i
,将首先迭代i
次,然后迭代i/2
,i/4
。。。时代。(其中,i
取决于n
)
我不知道第二个循环的大O,但我想答案应该是O(logn*something)
其中O(logn)
是外循环,something
是内循环
如何获得O(N)
?由于i/=2
,外循环的复杂性为O(logn)
。但内部循环有点棘手
内部循环的复杂性为O(i)
,但是外部循环的每次迭代i
都在变化。与外部循环相结合,您得到的复杂性为O(n/logn)
。如下所示:
内部循环执行的步数类似于上所述的1/(2n)
。首先,您正在执行n
步骤,然后只执行n/2
步骤,然后执行n/4
步骤等等,直到您只执行2
步骤,最后执行1
步骤。这加起来就是2n
的结果。总共运行内部循环logn
次(由外部循环定义)。这意味着内部循环平均运行2n次/log n
次。因此,您的复杂性为O(n/logn)
使用O(logn)
的外循环和O(n/logn)
的内循环,您可以得到O(logn*n/logn)
,可以简化为O(n)
,您可能想看看,因为这就是您正在做的。@Progman-hmm,所以内循环是O(n)
,外循环是O(logn)
?是和否。内部循环是O(i)
,但i
正在从外部改变。与外部循环结合使用时,内部循环看起来像O(N/logn)
。将其与外部O(logn)
相乘,得到与给定答案相同的O(N)
。@Progman你能详细说明一下i
=N/logn
?它是基于外部循环和N
的内部循环的平均步数。第一次迭代是n
步骤,最后一次迭代是1
步骤。在您的帮助下获得O(n/log n)
。谢谢。我唯一感到困惑的是为什么我们必须找到平均值?在外循环的每次迭代中(在O(logn)
处运行),内循环将在O(i)处运行
其中i=2n
。那么为什么我们需要找到内环的平均大O呢?@csguyi
不是2n
。而是取决于外环的实际迭代。开始时是n
,最后是1
。所以平均值是2n/logn
,即O(n/logn)
。如果它是i=2n
,那么你可以说它是O(n)
(它不是),这将导致O(n*logn)
(它不是)。你会根据外部循环的不同来计算迭代次数的平均值吗?你能看看你有时间吗
for (int i = n; i > 0; i /= 2) {
for (int j = 0; j < i; j++) {
//statement
}
}
Answer: O(N)