我无法完全理解如何编写随机算法的预期运行时间的重复发生。
我相信我正确地做到了,但如果有人可以看一下,那将是一个巨大的帮助。
这里是算法的伪代码:
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)。我正确接近这个吗?
答案 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")
。