给出以下伪代码,问题是变量 m 平均要更新多少次。
A[1...n]: array with n random elements
m = a[1]
for I = 2 to n do
if a[I] < m then m = a[I]
end for
一个答案可能是,由于所有元素都是随机的,因此该变量将平均以for循环的迭代次数的一半加上初始化的次数进行更新。
但是,我怀疑必须有一种更好的(也许是唯一正确的)方式来使用二项式分布来证明它, p = 1/2 。这样, m 上的平均更新次数将为
M = 1 + Σi=1 to n-1[k.Cn,k.pk.(1-p)(n-k)]
其中 C n,k 是二项式系数。我已经尝试解决此问题,但是由于不知道如何继续,因此我坚持了一些步骤。
有人可以解释两个答案中哪个是正确的,如果是第二个,请教我如何计算 M ?
谢谢您的时间
答案 0 :(得分:3)
假设数组的元素是不同的,则m
的预期更新次数为第n harmonic number,H n ,这是k的1 / k之和,范围是1到n。
求和公式也可以由递归表示:
H1 = 1
Hn = Hn−1+1/n (n > 1)
很容易看出递归与问题相对应。
考虑n-1个数字的所有排列,并假定期望的分配数为H n-1 。现在,n个数字的每个排列都包含n-1个数字的排列,在n-1个现有值之一的开头或之后,在n个可能的插入点之一中插入了一个新的最小数字。由于它比现有序列中的每个数字都小,因此仅在将其插入开头的情况下才将其分配给m。那的概率为1 / n,因此n个数字的排列的预期分配数量为H n-1 + 1 / n。
由于长度为1的向量的预期赋值数量显然为1,即H 1 ,因此我们可以归纳证明递归。
H n 渐近等于ln n +γ,其中γ为the Euler-Mascheroni constant,约为0.577。因此它没有限制地增加,但是非常缓慢。
m
为其更新的值称为从左到右的最大值,通过搜索该术语,您可能会找到有关它们的更多信息。
答案 1 :(得分:0)
我喜欢@rici的答案,所以我决定进一步阐述其中心论点,以使我更清楚。
让H[k]
为计算长度为m
的数组的最小k
所需的预期分配数量,如所考虑的算法所示。我们知道
H[1] = 1.
现在假设我们有一个长度为n > 1
的数组。最小值可以位于数组的最后一个位置,也可以不在数组的最后一个位置。它以概率1/n
位于最后一个位置。它不是1 - 1/n
的概率。在第一种情况下,预期的分配数量为H[n-1] + 1
。在第二个中,H[n-1]
。
如果我们将每种情况的预期任务分配数乘以其概率和总和,便得出
H[n] = (H[n-1] + 1)*1/n + H[n-1]*(1 - 1/n)
= H[n-1]*1/n + 1/n + H[n-1] - H[n-1]*1/n
= 1/n + H[n-1]
显示递归。
请注意,如果最小值位于最后一个位置或位于第一个n-1
中,而不是位于两个位置,则该参数有效。因此,我们使用数组的所有元素都是不同的。