我需要帮助在大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块的时间复杂度,似乎花费的时间更少,但我无法确定多少
答案 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块分开: