在O(n)中运行的数组“最大差异”算法?

时间:2012-04-21 20:56:23

标签: algorithm sorting linear

给定N个整数数组,对数组进行排序,并在排序数组中找到具有最大差异的2个连续数字。 示例 - 输入[1,7,3,2]输出4(排序数组为[1,2,3,7],最大差异为7-3 = 4)。

算法A在O(NlogN)时间内运行。

我需要找到一个与算法A功能相同的算法,它在O(N)时间内运行。

更新:

解决方案: http://cgm.cs.mcgill.ca/~godfried/teaching/dm-reading-assignments/Maximum-Gap-Problem.pdf

4 个答案:

答案 0 :(得分:13)

让数组为X,让n =长度(X)。将每个元素x放在桶号底层((x - min(X))*(n - 1)/(max(X) - min(X)))。每个桶的宽度是(max(X) - min(X))/(n - 1),并且最大相邻差异至少是那么多,因此所讨论的数字在不同的桶中结束。现在我们所要做的就是考虑其中一个是桶i中的最大值的对,另一个是桶j中的最小值,其中i <1。 j和(i,j)中的所有桶k都是空的。这是线性时间。

证明我们确实需要地板:让函数为f(X)。如果我们可以在线性时间内计算f(X),那么我们肯定可以在线性时间内决定是否

0&lt; f(X)≤(max(X) - min(X))/(length(X) - 1),

,即X的元素是否均匀分布并且不是全部相同。让这个谓词为P(X)。 P的支持具有阶乘(长度(X))连通分量,因此代数计算模型的通常Ω(n log n)下界适用。

答案 1 :(得分:5)

执行Counting Sort,然后扫描结果以获得最大差异。

由于连续数量要求,乍一看似乎任何解决方案都需要排序,这意味着最好是O( n log n ),除非你的号码范围对计数排序有足够的约束。但如果是的话,你就赢了O( n )。

答案 2 :(得分:0)

  1. 查找最低和最高
  2. 从数组中选择一个随机数k
  3. 通过将所有小于k的值放在左边并且大于k放在右边,对算法进行排序。
  4. 您知道两个组的最小值和最大值,假设值在海峡线上,计算左侧组的gape。为正确的群体做同样的事。
  5. 跟那个得到更大声的小组一起去2,你知道那个小组的最小和最大。执行此操作直到所选组的值不超过4个。
  6. 您现在拥有一个只有4个元素的组,排序并找到解决方案。
  7. 以下是此算法的工作原理示例:

    • 输入:9 5 3 4 12 9 31 17
    • 选择随机数:k = 9
    • 按较小和较大的k
    • 值排序
    • 5 3 4 9 9 12 31 17,k在指数3
    • 左组gape =(9 + 3)/(4-1)= 4
    • 右组gape =(31 + 9)/(5 - 1)= 10
    • 我们选择了正确的组9 9 12 31 17
    • 选择随机数:k = 12
    • 按较小和较大的k
    • 值排序
    • 9 9 12 31 17,k在索引2
    • 左组gape =(12 + 9)/(3 - 1)= 11.5
    • 右组gape =(31 + 12)/(3 - 1)= 21.5
    • 12 31 17的最大开口是31 - 17 = 14

    我的算法与Selection Algorithm非常相似,用于在线性时间内找到排序算法的k索引值。

答案 3 :(得分:0)

现在,首先尝试考虑一下,如果在MIN的{​​{1}}中已经给了最小值MAX和最大值array,在什么情况下差距是最小还是最大?

很明显,当所有元素都是size NMIN组成MAX时,最大间隙将最大。

当所有元素在maxgap = MAX - MINMIN之间均等间隔时,最大间隙将最小。可以说它们之间的间隔是间隙。

所以,它们排列为

MAX

因此,我们现在知道我们的答案将位于MIN, MIN + gap, MIN + 2*gap, MIN + 3*gap, ... MIN + (N-1)*gap where MIN + (N-1)*gap = MAX . gap = (MAX - MIN) / (N - 1). 中。 现在,如果我们知道答案不仅仅是差距,那么我们要做的就是为范围创建大小差距的桶。

range [gap, MAX - MIN]

只会有[MIN, MIN + gap), [Min + gap, `MIN` + 2* gap) ... and so on 个这样的存储桶。我们根据它们的值将它们放在这些存储桶中。

如果您从一个存储桶中选择任意两个数字,它们的差将小于差距,因此它们将永远不会对(N-1)有所贡献(请记住maxgap)。我们只需要在每个存储桶中存储最大数量和最小数量,就可以查看整个存储桶中的数字。

现在,我们只需要按顺序遍历存储桶(它们是 已经按value排序),并得到min_value与 前一个值区的max_value,至少包含一个值。我们采用所有这些值中的最大值。

maxgap >= gap