变量m被更新了多少次

时间:2018-09-01 21:28:27

标签: algorithm pseudocode discrete-mathematics

给出以下伪代码,问题是变量 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

谢谢您的时间

2 个答案:

答案 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中,而不是位于两个位置,则该参数有效。因此,我们使用数组的所有元素都是不同的。