Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 嵌套for循环的时间复杂度_Algorithm_Time Complexity_Big O - Fatal编程技术网

Algorithm 嵌套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循环:

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;