发电机有多少次电话?

时间:2013-02-22 08:38:29

标签: algorithm recursion

假设我有以下算法:

procedure(n)
   if n == 1 then break
   R = generaterandom()
   procedure(n/2)

现在我明白这个算法的复杂性是log(n),但它会对log(n)调用随机生成器或log(n)-1,因为{{1}时调用它不会被调用}}

很抱歉,如果这是显而易见的,但我一直在环顾四周,并没有真正说明确切答案是什么。

2 个答案:

答案 0 :(得分:1)

有对生成器的ceil(log(n))调用


证明使用归纳法:

<强>假设
每个ceil(log(k))

k<n次生成器调用

<强>基
log_2(1)= 0 =&gt; 0个电话

<强>步骤
对于任意n>1,有一个调用,然后来自假设ceil(log(n/2)在递归调用中的更多调用。
这给了我们ceil(log(n/2))+1 = ceil(log(n/2)) + log(2) = ceil(log(n/2 * 2)) = ceil(log(n))次电话总数

<强> QED

注意:在这里,所有日志都以base 2为基础。

答案 1 :(得分:-1)

通过Master's Theorem,你的方法可以写成T(n)= T(n / 2)+ O(1),因为你将n分成每个函数调用的一半,这正好是O (记录n)。 - 我意识到你并不是要求进行复杂性分析,但正如我所提到的,这个想法是一样的(即找到调用次数相当于它的复杂性)