基本随机算法重现

时间:2016-03-04 05:02:33

标签: algorithm random time-complexity asymptotic-complexity recurrence

我无法完全理解如何编写随机算法的预期运行时间的重复发生。

我相信我正确地做到了,但如果有人可以看一下,那将是一个巨大的帮助。

这里是算法的伪代码:

printIntegers(A, n)   // an array A of integers is the input, with n integers
    if A.length > 0
        for i = 1 to n
            print A[i]
        randInt = rand(1, 10)
        if randInt != 10
            return
        else 
            printIntegers(A, n-1)

唯一的随机部分是1到10之间的随机生成器。我试图了解这将如何在重复中转化。

我在想:

T(n) = O(n)               if a != 10     probability = 9/10
       T(n-1) + O(n)         a = 10                  = 1/10 
       T(n-2) + O(n)
       ....
       T(0) + O(n)          

这在我的脑海中是有意义的,然后预期的运行时间将是O(n)。我正确接近这个吗?

2 个答案:

答案 0 :(得分:1)

请注意,初始条件应该在检查中使用n,而不是A.length,因为后者在递归中没有变化。

expected调用递归的0.1次。期望与调用递归的概率相同。在当前情况下,如果随机数生成器是真正随机的,则数字10将出现1/10次。同样,没有递归的预期次数是0.9。但O(n)出现在两种情况下,因此在考虑期望值时,等式将是:

T(n) = (0.9 + 0.1) * O(n) + 0.1 * T(n-1)
     = O(n) + 0.1 * T(n-1)
     = O(n) + 0.1 * (O(n-1) + 0.1 * T(n-2))
     = O(n) + 0.1 * O(n-1) + 0.1^2 * O(n-2) +...
     = O(n) * (0.1 + 0.1^2 +...+0.1^(n-1)) + 0.1^(n-1) * T(1)
     = O(n) * (1 - 0.1^n)/0.9 + K

以上为O(n * (1 - 0.9^n)/0.9),与O(n)基本相同,具体取决于您的准确性需求。

答案 1 :(得分:0)

首先请注意:

T(n) = n + (n-1)/10 + (n-2)/10^2 + ... + 1/10^{n-1}
     < n + n/10 + n/10^2 + ... + n/10^{n-1}
     = n(1 + 1/10 + ... + 1/10^{n-1})
     < n(1 + 1/10 + 1/10^2 + ...)
     = n/(1 - 1/10) = 10n/9

然后,限制上面的T(n):

T(n) = n + (n-1)/10 + (n-2)/10^2 + ... + 1/10^{n-1}
     > n

并在下面加以限制:

n < T(n) < 10n/9

所以T(n)Theta(n)args=("a" "b" "c")