假设do_something是O(1),我该如何计算这个函数的时间复杂度?
function run(n) {
for(var i = 1; i <= n; i++) {
var counter = 1;
while(counter <= n) {
for (var j = counter; j >= 1; j--) {
do_something();
}
counter = counter * 2;
}
}
}
我假设初始for循环意味着复杂性将是n而内部while循环意味着log(n)。这是真的?
如何计算所有内容的复杂程度? 谢谢。
答案 0 :(得分:0)
计算所有事物的复杂性并非易事,因为有一些功能(例如,谜题猜想),其中没有确切的分析。在这种情况下,您可以进行实证分析,您可以猜测哪个运行时类最匹配。
与您的样本相关:
这意味着循环的内指数(2 ^ m)被称为m = log(n)次。 所以你有2 ^(log n)= n log(2)= n
你也可以这样做。内部指数函数称为日志时间。表示log(2 ^ m) - &gt; (2 ^ n = 2 ^ m) - &gt; m = n。
您还可以简单地创建从m = 0到m = log(n)的2 ^ m的和,即2n-1 - >为O(n)。
然后你必须将外部for循环的线性时间乘以while循环的线性时间(包括内部for循环)。所以你有O(n * n)= O(n²)时间。
答案 1 :(得分:0)
可以计算确切的步数。
1, 2, 4, 8, ..., 2^(bitLength(n)-1)
总和为2^bitLength(n) - 1
其中bitLength(n) = trunc(ln(n)/ln(2))+1
将这两者相乘,得出确切的步骤数:
n * (2^bitLength(n) - 1)
近似的复杂性是 O(n 2 ),因为O(2^bitLength(n) - 1) = O(n)