在n个可能不同的位置找到k个对象中最大的最小距离?

时间:2015-01-15 19:15:16

标签: algorithm

在n个可能的不同位置找到k个对象之间最大最小距离的有效方法是什么?

例如:

N:不同职位的数量 可以说N = 5 这5个职位是{1,2,4,8,9}

K:假设k = 3

的对象数量

所以可能的答案(最大最小距离)将是:3如果我们将对象放在{1,4,8}或{1,4,9}

1 个答案:

答案 0 :(得分:7)

  1. 让我们对答案进行二元搜索。

  2. 对于固定答案x,我们可以使用简单的线性贪婪算法检查是否可行(选择第一个元素,然后迭代数组的其余部分,添加当前元素,如果它与最后拾取的元素之间的距离大于或等于x)。最后,我们只需要检查所选元素的数量是否至少为k

  3. 时间复杂度为O(n * log MAX_A),其中MAX_A是数组的最大元素。

    以下是此算法的伪代码:

    def isFeasible(positions, dist, k):
        taken = 1
        last = positions[0]
        for i = 1 ... positions.size() - 1:
            if positions[i] - last >= dist:
                taken++
                last = positions[i]
        return taken >= k
    
    def solve(positions, k):
        low = 0 // definitely small enough
        high = maxElement(positions) - minElement(positions) + 1 // definitely too big
        while high - low > 1:
            mid = (low + high) / 2
            if isFeasible(positions, mid, k):
                low = mid
            else:
                high = mid
        return low