algorithm - 变量 m 更新了多少次

标签 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.C<sub>n,k</sub>.p<sup>k</sup>.(1-p)<sup>(n-k)</sup>]

其中 Cn,k 是二项式系数。我试图解决这个问题,但由于我不知道如何继续,所以我坚持了一些步骤。

谁能告诉我这两个答案中哪一个是正确的,如果是第二个,请告诉我如何计算 M

谢谢你的时间

最佳答案

假设数组的元素不同,m 的预期更新次数是第 n harmonic number , Hn, 是1到n范围内k的1/k之和。

求和公式也可以用递归表示:

H<sub>1</sub> = 1
H<sub>n</sub> = H<sub>n−1</sub>+1/n (n > 1)

很容易看出递归对应问题。

考虑 n−1 个数的所有排列,并假设预期的分配数为 Hn−1。现在,n 个数字的每个排列都由 n-1 个数字的排列组成,在 n 个可能的插入点之一插入一个新的最小数字:在开头或在 n-1 个现有值之一之后。由于它比现有系列中的每个数字都小,因此只有在开头插入的情况下才会分配给 m。它的概率为 1/n,因此 n 个数排列的预期分配数为 Hn−1 + 1/n。

由于长度为 1 的向量的预期分配数显然为 1,即 H1,因此我们有递归的归纳证明。

Hn 渐近等于 ln n + γ 其中 γ 是 the Euler-Mascheroni constant ,大约为 0.577。因此它会无限增加,但会非常缓慢。

更新 m 的值称为从左到右的最大值,您可能会通过搜索该术语找到有关它们的更多信息。

关于algorithm - 变量 m 更新了多少次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52132326/

相关文章:

二维游戏算法

c++ - 将图拆分为循环,然后拆分为路径

java - 伪代码非极大值抑制

c - 将乘法算法从伪代码转换为 C

c - 有什么办法可以在不增加变量的情况下解决这个数学问题吗?

c - 直接查找子集 c

algorithm - n 算法的基 b 扩展

c - 从 C 中的通用 (void *) 列表中删除元素

java - 我该如何改进这个映射算法

python - GA童话世代