Time complexity 分析该函数的时间复杂度

Time complexity 分析该函数的时间复杂度,time-complexity,Time Complexity,假设do_某物是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;

假设do_某物是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;
    }

  }
}
函数运行(n){

对于(var i=1;i计算每件事情的复杂性并不简单,因为有些函数(例如collatz猜想)不知道精确的分析。在这种情况下,您可以进行经验分析,猜测哪种运行时类最匹配

与您的样品相关:

  • 外部for循环被调用n次
  • while循环称为log(n)次
  • 内部for循环称为计数器时间,其中计数器增长2^m。但计数器会重新计算日志(n)次
  • 这意味着循环的内部指数(2^m)称为m=log(n)次。 所以你有2^(logn)=n log(2)=n

    反之亦然。内部指数函数称为对数时间。表示对数(2^m)->(2^n=2^m)->m=n

    您还可以简单地创建一个从m=0到m=log(n)的2^m之和,即2n-1->O(n)


    然后你必须将外部for循环的线性时间乘以while循环的线性时间(包括内部for循环)。因此你有O(n*n)=O(n²)时间。

    可以计算出精确的步数

  • 外部循环运行n次
  • while和最内部的循环是计数器的每个值的运行计数器时间,它们是
    1,2,4,8,…,2^(位长度(n)-1)
    其总和为
    2^位长度(n)-1
  • 其中
    位长度(n)=trunc(ln(n)/ln(2))+1

    将这两个值相乘,即可得出精确的步数:

    n*(2^位长度(n)-1)


    近似复杂度为O(n2),因为
    O(2^位长(n)-1)=O(n)

    您能详细说明一下如何得到nlog(n)吗?