给定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
答案 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)
k
k
的值放在左边并且大于k
放在右边,对算法进行排序。以下是此算法的工作原理示例:
我的算法与Selection Algorithm非常相似,用于在线性时间内找到排序算法的k索引值。
答案 3 :(得分:0)
现在,首先尝试考虑一下,如果在MIN
的{{1}}中已经给了最小值MAX
和最大值array
,在什么情况下差距是最小还是最大?
很明显,当所有元素都是size N
或MIN
组成MAX
时,最大间隙将最大。
当所有元素在maxgap = MAX - MIN
和MIN
之间均等间隔时,最大间隙将最小。可以说它们之间的间隔是间隙。
所以,它们排列为
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