Algorithm 嵌套for循环的时间复杂度
给定以下嵌套for循环:Algorithm 嵌套for循环的时间复杂度,algorithm,time-complexity,big-o,Algorithm,Time Complexity,Big O,给定以下嵌套for循环: for (int i=n; i>1; i=i/2): for (int j=i; j<n; j=j*2) # O(1) expression for(int i=n;i>1;i=i/2): 对于(intj=i;j这是一个使用格言的好地方 当有疑问时,从内到外工作 也就是说,从获取最里面的循环开始,用一个表达式替换它,该表达式指示它正在做多少工作,然后重复此操作,直到完成为止 在您的例子中,最里面的循环是 for (int j=i;
for (int i=n; i>1; i=i/2):
for (int j=i; j<n; j=j*2)
# O(1) expression
for(int i=n;i>1;i=i/2):
对于(intj=i;j这是一个使用格言的好地方
当有疑问时,从内到外工作
也就是说,从获取最里面的循环开始,用一个表达式替换它,该表达式指示它正在做多少工作,然后重复此操作,直到完成为止
在您的例子中,最里面的循环是
for (int j=i; j<n; j=j*2)
# O(1) expression
那么,最终的总功是多少呢?好的,外部循环将在i=n时运行一次,然后在i=n/2时运行一次,然后在i=n/4时运行一次,以此类推,所以完成的总功是
Θ(对数(n/n)+对数(n/(n/2))+对数(n/(n/4))+…+对数(n/1))
=Θ(对数1+对数2+对数4+对数8+…+对数n)
=Θ(对数20+对数21+对数22+对数23+…+对数2log n)
Θ(0+1+2+…+对数n)
记住0+1+2+…+k=k(k+1)/2=Θ(k2),所以这里完成的总功是
Θ(0+1+2+…+对数n)
=Θ(log2n)
得出这个答案的关键技术是从内部开始,将对数与重复将某个大小加倍时执行的循环迭代次数联系起来,以及1+2+…+k的公式。是的,答案是O(log(n)*log(n)),但这可能不是你想的原因。你是如何得出这个答案的?
for (int i=n; i>1; i=i/2):
Do Θ(log (n / i)) work;