分析此功能的时间复杂度

时间:2017-04-05 14:06:57

标签: time-complexity

假设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)。这是真的?

如何计算所有内容的复杂程度? 谢谢。

2 个答案:

答案 0 :(得分:0)

计算所有事物的复杂性并非易事,因为有一些功能(例如,谜题猜想),其中没有确切的分析。在这种情况下,您可以进行实证分析,您可以猜测哪个运行时类最匹配。

与您的样本相关:

  1. 外部for循环称为n次
  2. while循环称为log(n)次
  3. 内部for循环称为计数器时间,其中计数器增长2 ^ m。但是计数器是重新计算的log(n)次
  4. 这意味着循环的内指数(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. 外部循环 n
  2. 对于计数器的每个值,while和inner-most循环运行 counter 次,这些是1, 2, 4, 8, ..., 2^(bitLength(n)-1) 总和为2^bitLength(n) - 1
  3. 其中bitLength(n) = trunc(ln(n)/ln(2))+1

    将这两者相乘,得出确切的步骤数:

    n * (2^bitLength(n) - 1)

    近似的复杂性是 O(n 2 ,因为O(2^bitLength(n) - 1) = O(n)