寻找阵列中局部尖峰的理论界限

问题描述

给定一个数组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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...