假设原始数组包含值 1、2、...、N。
令 X_i, i = 1..N 为随机变量,如果 i 在算法过程中的某个时刻是最大值,则取值为 1。
那么算法所取的最大值就是随机变量:M = X_1 + X_2 + ... + X_N。
平均值为(根据定义)E(M) = E(X_1 + X_2 + ... + X_N)。使用线性期望,这是 E(X_1) + E(X_2) + .. + E(X_N),即 prob(1 出现为最大值) + prob(2 出现为最大值) + ... + prob (N 显示为最大值)(因为每个 X_i 取值 0 或 1)。
我什么时候出现最大值?它是当它首先出现在 i、i+1、i+2、...、N 中的数组中时。这种概率是 1/(N-i+1)(因为这些数字中的每一个都同样可能成为第一)。
所以... prob(i 出现为最大值) = 1/(N-i+1),总体期望是 1/N + 1/(N-1) + ..+ 1/3 + 1/2 + 1/1
这是谐波(N),它由 ln(N) + emc 非常近似,其中 emc ~= 0.5772156649,欧拉-马斯切罗尼常数。
由于在问题中您没有将最大值的初始设置计为第一个值,因此实际答案是谐波(N) - 1,或大约 ln(N) - 0.4227843351。
快速检查一些简单的情况:
- N=1,只有一个排列,没有最大更新。谐波 (1) - 1 = 0。
- N=2,排列为 [1, 2] 和 [2, 1]。第一个更新最大值一次,第二个零次,所以平均值是 1/2。谐波 (2) - 1 = 1/2。
- N=3,排列为 [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2 , 1]。最大更新分别为 2、1、1、1、0、0。平均值为 (2+1+1+1)/6 = 5/6。谐波 (3) - 1 = 1/2 + 1/3 = 5/6。
所以理论上的答案看起来不错!