如何计算该算法的大O表示法的时间复杂度

时间:2014-02-03 09:26:05

标签: big-o complexity-theory time-complexity

我需要帮助在大O符号中找到此函数的时间复杂度:

int myfunction(bool exists)
{
    int var=0; int k,j,n;
    if (exists)
       for(k=1; k<=n; k*=2)
          for(j=1; j<=k; j++)
             var++;
    else
       for(k=1; k<=n; k*=2)
          for(j=1; j<=n; j++)
             var++;
    return var;
}

从我从书中理解的情况来看,在这种情况下,当我们有if-else块时,算法的整体复杂性是两个块的最坏情况,所以我计算了else块的复杂性,它有一个O(log2(n))的复杂性,如果我错了,请纠正我,但是我很难找到if块的时间复杂度,似乎花费的时间更少,但我无法确定多少

2 个答案:

答案 0 :(得分:1)

在else的情况下,你循环n * floor(log 2(n))次。因为我们想要big-O,所以我们采取最坏的情况,其中floor(log 2(n))== log2(n)。因此,else循环是O(n log2(n))。实际上我通常在这里写O(n log(n)) - 在大O表示法中你没有放入常数因子,比如日志基数的变化。

在if情况下,内循环运行1,2,4,...,2 ^ x次,其中x是floor(log2(n))。循环总数是这些数字的总和,即2 ^(x + 1)-1。如果您不能立即看到这一点,请注意1,2,4等只是二进制数字。如果你填写这些数字总数是多少?你会看到它是一个像11111这样的二进制数。

因此if循环需要2 ^(floor(log 2(n))+ 1) - 1步;在最坏的情况下,这是2 ^(log 2(n)+ 1) - 1 = 2n - 1.保持最大项,并且丢弃常数,这是O(n)。

答案 1 :(得分:1)

一个正式的答案是,将IF块和ELSE块分开:

enter image description here