如何在O(n)时间内找到矢量中的最大间隙?

时间:2013-02-27 20:22:47

标签: algorithm

您可以在高速公路的同一车道上获得各种车辆的位置,而不是特定的顺序。如何在O(n)时间内找到相邻车辆之间的最大差距?

似乎一个简单的解决方案就是排序然后检查,但当然这不是线性的。

2 个答案:

答案 0 :(得分:7)

将矢量除以n + 1个相同大小的桶。对于每个这样的桶,存储最大值和最小值,可以丢弃所有其他值。由于鸽笼原理,这些部分中至少有一个是空的,因此任一部分的非最小值/非最大值对结果没有影响。

然后,遍历水桶并计算到下一个和前一个非空桶的距离,并取最大值;这是最终的结果。

n = 5且值为5,2,20,17,3的示例。最小值为2,最大值为20 =>铲斗尺寸为(20-2)/ 5 = 4。

Bucket:   2    6    10    14     18     20
Min/Max:   2-5   -    -     17,17  20,20

差异:2-5,5-17,17-20。 最高为5-17。

答案 1 :(得分:0)

我的Python实现ipc的解决方案:

def maximum_gap(l):
    n = len(l)
    if n < 2:
        return 0
    (x_min, x_max) = (min(l), max(l))
    if x_min == x_max:
        return 0
    buckets = [None] * (n + 1)
    bucket_size = float(x_max - x_min) / n
    for x in l:
        k = int((x - x_min) / bucket_size)
        if buckets[k] is None:
            buckets[k] = (x, x)
        else:
            buckets[k] = (min(x, buckets[k][0]), max(x, buckets[k][1]))
    result = 0
    for i in range(n):
        if buckets[i + 1] is None:
            buckets[i + 1] = buckets[i]
        else:
            result = max(result, buckets[i + 1][0] - buckets[i][1])
    return result

assert maximum_gap([]) == 0
assert maximum_gap([42]) == 0
assert maximum_gap([1, 1, 1, 1]) == 0
assert maximum_gap([1, 2, 3, 4, 6, 8]) == 2
assert maximum_gap([5, 2, 20, 17, 3]) == 12

我使用tuple作为广告素材的元素,None如果为空。在最后一部分中,我通过将任何剩余的空桶分配给前一个空桶来预先消除(这是有效的,因为第一个空桶确保非空)。

注意所有元素相等的特殊情况。