这是我正在讨论的代码段的伪代码,
temp = 1
repeat
for i = 1 to n
temp = temp+1;
n = n/2;
until n<=1
我知道外循环(重复)执行 n 次。 for循环怎么样?是否可以将其作为n / 2的递归调用?我如何在这里申请硕士定理?
答案 0 :(得分:4)
在外循环的第一次迭代中,内循环将执行n
次。在下一次迭代中,内部循环将执行n/2
次,依此类推......
因此,我们得到几何系列n + n/2 + n/4 + ...
的总和,即2*n
或O(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}
从这里应用主定理应该很容易。