如何找到此代码段的复杂性?

时间:2015-05-31 13:45:04

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

这是我正在讨论的代码段的伪代码,

temp = 1

repeat
  for i = 1 to n
    temp = temp+1;

  n = n/2;
until n<=1

我知道外循环(重复)执行 n 次。 for循环怎么样?是否可以将其作为n / 2的递归调用?我如何在这里申请硕士定理?

2 个答案:

答案 0 :(得分:4)

在外循环的第一次迭代中,内循环将执行n次。在下一次迭代中,内部循环将执行n/2次,依此类推......

因此,我们得到几何系列n + n/2 + n/4 + ...的总和,即2*nO(n)

答案 1 :(得分:0)

首先,我假设您正在考虑添加temp作为具有您想要估算的成本的操作。我将n的初始值称为N,以区分当前值和初始值。此外,我假设n是不可变的,for循环的步骤是1

由于n在每次迭代中减半,外部循环执行log N(基数2)次。在每次迭代中,内部for循环正在进行n次迭代:

N用于外循环的第一次迭代,N/2用于第二次迭代,N/(2*2)用于第三次,依此类推。一般来说,在外部循环的第i次迭代中,内部循环运行N/(2^i)次(假设i为零索引,否则在指数中使用i - 1

在数学上,你有:

sum from 0 to log(N) - 1 of N/(2^i)

但是有一种不同的方法:

您会看到一个迭代算法,但它可以很容易地转换为递归算法(floor正在进行整数除法):

(defun recursive-outer (n temp)
  (if (<= n 1)
      temp
      (recursive (floor n 2) (inner n temp))))

这很容易转化为主定理方程

T(n) = 1 * T(n/2) + f(n)

f(n) = inner(n)O(n)。{/ 1>。{/ 1}

从这里应用主定理应该很容易。