假设我有以下算法:
procedure(n)
if n == 1 then break
R = generaterandom()
procedure(n/2)
现在我明白这个算法的复杂性是log(n)
,但它会对log(n)
调用随机生成器或log(n)-1
,因为{{1}时调用它不会被调用}}
很抱歉,如果这是显而易见的,但我一直在环顾四周,并没有真正说明确切答案是什么。
答案 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)。 - 我意识到你并不是要求进行复杂性分析,但正如我所提到的,这个想法是一样的(即找到调用次数相当于它的复杂性)