这些循环的时间复杂度函数 [ T(n) ] 是多少?
What's the time-complexity function [ T(n) ] for these loops?
j = n;
while (j>=1) {
i = j;
while (i <= n) { cout<<"Printed"; i*= 2; }
j /= 2;
}
我的目标是找到 T(n)(为我们提供算法执行次数的函数),其顺序预计为 n.log(n),但我需要至少对 n 可以正常工作的确切函数=1 到 n=10 数据
我尝试预测函数,最后我以 *T(n) = floor((n-1) log(n)) + n
这仅适用于 n=1 和 n=2。
我应该提一下,我发现通过将原始代码转换为 for 循环的函数不准确,如下所示:
for ( j = 1 ; j <= n ; j*= 2) {
for ( i = j ; i<= n ; i*=2 ) {
cout << "Printed";
}
}
最后,感谢您帮助我提前找到准确的 T(n)。
外循环和内循环都是O(log₂ N)
.
所以总时间是
O(log₁₀ N * log₂ N)
== O(2 * log₂ N)
刚刚减少到 O(lg N)
使用log(x)
是基于log的floor 2
1.)
内循环执行 1+log(N)-log(j)
外循环执行 1+log(N)
次,其中 j=1,2,4...N 次,总复杂度为 T(N)=log(N)log(N)+2*log(N)+1-(log(1)+log(2)+log(4)...+log(N))= log(N)^2-(0+1+2+...+log(N))+2*log(N)+1= log(N)^2-log(N)(log(N)-1)/2+1= log(N)^2/2+3*log(N)/2+1
2.) 此处相同,只是顺序相反。
我知道这不是证明,但可能比数学更容易理解:godbolt 玩 n。它总是 returns 0;
j = n;
while (j>=1) {
i = j;
while (i <= n) { cout<<"Printed"; i*= 2; }
j /= 2;
}
我的目标是找到 T(n)(为我们提供算法执行次数的函数),其顺序预计为 n.log(n),但我需要至少对 n 可以正常工作的确切函数=1 到 n=10 数据
我尝试预测函数,最后我以 *T(n) = floor((n-1) log(n)) + n
这仅适用于 n=1 和 n=2。
我应该提一下,我发现通过将原始代码转换为 for 循环的函数不准确,如下所示:
for ( j = 1 ; j <= n ; j*= 2) {
for ( i = j ; i<= n ; i*=2 ) {
cout << "Printed";
}
}
最后,感谢您帮助我提前找到准确的 T(n)。
外循环和内循环都是O(log₂ N)
.
所以总时间是
O(log₁₀ N * log₂ N)
== O(2 * log₂ N)
刚刚减少到 O(lg N)
使用log(x)
是基于log的floor 2
1.)
内循环执行 1+log(N)-log(j)
外循环执行 1+log(N)
次,其中 j=1,2,4...N 次,总复杂度为 T(N)=log(N)log(N)+2*log(N)+1-(log(1)+log(2)+log(4)...+log(N))= log(N)^2-(0+1+2+...+log(N))+2*log(N)+1= log(N)^2-log(N)(log(N)-1)/2+1= log(N)^2/2+3*log(N)/2+1
2.) 此处相同,只是顺序相反。
我知道这不是证明,但可能比数学更容易理解:godbolt 玩 n。它总是 returns 0;