问题描述
给定一个数组A[1..n],它由随机排列的不同整数组成。
这个数组的一个元素,A[i],如果它大于它前面的所有元素(换句话说,对于所有 j A[ j]).
证明 A 中预期的局部尖峰数量为 O(logn)。
如果有人能给我指点这个问题,我将不胜感激!
解决方法
类似于快速排序时间复杂度的推理。
因此,尽管它更多地与统计有关,但它可以作为推理算法复杂性的一个很好的例子。也许它比统计更适合 CS stackexchange?话虽如此,让我们潜入兔子洞。
首先,由于所有数字都是不同的,我们可以省略关于随机整数数组的部分,而只取整数 1,2,...,N 而不失一般性。
现在我们可以改变看待问题的方式了。我们可以说我们正在选择范围 1..N 中的一个随机数,而不是拥有数组。
另一个观察结果是,通过选择一个数字 X,无论它是否是局部尖峰,我们都取消了所有低于局部尖峰的数字的资格。
由于我们现在正在选择数字,因此我们可以从候选池中丢弃所有 Y,其中 Y
所以问题变成了我们可以重复这个过程多少次:
- 从候选池中选择一个数字作为新的峰值
- 丢弃所有较小的数字
在我们丢弃整个候选池之前(从完整的 1..N 范围开始)。毫不奇怪,这与快速排序递归的预期深度 log(n) 几乎相同。
如果您不想查看 wiki 的快速解释:大多数情况下,我们会丢弃大约一半的候选人。有时少,有时多,但从长远来看,一半是相当不错的估计。可以找到更深入的解释here.
,确定此问题的解决方案的一种优雅方式如下:
定义二元随机变量 X1,X2,Xn
Xi = 1 如果 A[i] 是局部尖峰
Xi = 0 如果 A[i] 不是局部尖峰
我们看到局部尖峰的总数始终是 Xi 的总和。我们知道
E[X1 + X2 + ... + Xi] = E[X1] + E[X2] + ... + E[Xn]
通过期望的线性。所以我们现在必须注意为每个 i 推导 E[Xi]。
现在 E[Xi] = P(A[i] 是一个尖峰)。对于所有 j A[j] 的概率是多少?
这只是 A[1],A[2],A[i] 的最大元素为 A[i] 的概率。但是这个最大元素可以以相同的概率位于从 A[1] 到 A[i] 的任何地方。所以最大元素是A[i]的概率是1/i。
所以 E[Xi] = 1/i。然后我们看到
E[尖峰总数] = E[X1] + E[X2] + ... + E[Xn] = 1/1 + 1/2 + ... + 1/n
这是第 n 个谐波数,Hn。众所周知,Hn ~ ln(n)。这是因为 ln(n)