随机数的递归

时间:2016-08-24 22:47:25

标签: algorithm recursion probability

function foo(n)  
     if n = 1 then  
        return 1  
     else  
        return foo(rand(1, n))  
     end if  
   end function

如果最初使用m作为参数调用foo,那么调用rand()的预期次数是多少?

BTW,rand(1,n)返回1到n范围内均匀分布的随机整数。

1 个答案:

答案 0 :(得分:6)

一个简单的例子是计算f(2)需要多少次调用。假设此时间为x,然后x = 1 + 0/2 + x/2,因为我们会进行实际调用1,然后概率为1/2,我们会以f(1)概率{{1}我们留在1/2。求解等式会给我们f(2)

与递归的大多数运行时分析一样,我们尝试获取运行时间的递归公式。我们可以使用期望的线性来进行随机调用:

x = 2

因此

E[T(1)] = 0
E[T(2)] = 1 + (E[T(1)] + E[T(2)])/2 = 2
E[T(n)] = 1 + (E[T(1)] + E[T(2)] + ... E[T(n)])/n
        = 1 + (E[T(1)] + E[T(2)] + ... E[T(n-1)])/n + E[T(n)]/n
        = 1 + (E[T(n-1)] - 1)(n-1)/n + E[T(n)]/n

因此,E[T(n)](n-1) = n + (E[T(n-1)] - 1)(n-1) > 1:

n

这也是我们直觉所期望的,因为E[T(n)] = 1/(n-1) + E[T(n-1)] = 1/(n-1) + 1/(n-2) + ... + 1/2 + 2 = Harmonic(n-1) + 1 = O(log n) 应该在每次拨打n时大约一半。

我们也可能会考虑“最有可能的最坏情况”。为此,很容易使用马尔可夫的不等式,即f。设置P[X <= a*E[X]] >= 1-1/a我们得到概率为99%,算法对a = 100的调用少于100 * log n