嵌套for循环的时间复杂度

Nam*_*ood 4 c algorithm time big-o time-complexity

下面的代码块void function(int n)的时间复杂度是多少.

我的尝试是最外层循环运行n/2次,内部循环运行2 ^ q次.然后我将2 ^ q与n等同,并将q作为1/2(log n)与基数2.将时间复杂度相乘,得到我的值为O(nlog(n)),而答案为O(nlog ^ 2(n) )).

void function(int n) { 
    int count = 0; 
    for (int i=n/2; i<=n; i++)  
        for (int j=1; j<=n; j = 2 * j)
            for (int k=1; k<=n; k = k * 2) 
                count++; 
} 
Run Code Online (Sandbox Code Playgroud)

tem*_*def 6

是时候应用理解循环巢的黄金法则了:

如有疑问,请在里面工作!

让我们从原始循环嵌套开始:

    for (int i=n/2; i<=n; i++)  
        for (int j=1; j<=n; j = 2 * j)
            for (int k=1; k<=n; k = k * 2) 
                count++; 
Run Code Online (Sandbox Code Playgroud)

该内循环将运行Θ(log n)次,因为在循环的m次迭代之后我们看到k = 2 m并且当k≥n= 2 lg n时我们停止.所以让我们用这个更简单的表达式替换内部循环:

    for (int i=n/2; i<=n; i++)  
        for (int j=1; j<=n; j = 2 * j)
            do Theta(log n) work;
Run Code Online (Sandbox Code Playgroud)

现在,看看最里面的剩余循环.使用与之前完全相同的推理,我们看到此循环也运行Θ(log n)次.由于我们执行Θ(log n)迭代,每个迭代都执行Θ(log n),我们看到这个循环可以用这个更简单的循环替换:

    for (int i=n/2; i<=n; i++)
        do Theta(log^2 n) work;
Run Code Online (Sandbox Code Playgroud)

在这里,外环运行Θ(n)次,因此总运行时间为Θ(n log 2 n).

我认为,根据你在你的问题中所说的,你有正确的见解但只是忘了在两个副本的日志项中相乘,一个用于两个内循环中的每一个.