我最近在测试中遇到了这个问题:给定一组点m(都在 x 轴上)和一组 带有端点 [ l, r ]的线(再次在 x 轴上),找到n使得所有点都被一条线覆盖。证明您的解决方案总能找到最小子集。
我为它编写的算法的效果是:(比如说,行存储为数组,左端点在位置 0,右端点在位置 1)
algorithm coverPoints(set[] m, set[][] n):
chosenLines = []
while m is not empty:
minX = min(m)
bestLine = n[0]
for i=1 to length of n:
if n[i][0] <= minX and n[i][1] > bestLine[1] then
bestLine = n[i]
add bestLine to chosenLines
for i=0 to length of m:
if m[i] <= bestLine[1] then delete m[i] from m
return chosenLines
我只是不确定这是否总能找到最小的解决方案。这是一个简单的贪心算法,所以我的直觉告诉我它不会,但是我的一个朋友在这方面比我好得多,他说对于这个问题,像这样的贪心算法总是能找到最小的解决方案。为了证明我的总是找到最小的解决方案,我做了一个非常手动的矛盾证明,我做了一个可能根本不正确的假设。我完全忘记了我做了什么。
如果这不是一个最小的解决方案,有没有办法在少于 O(n!) 的时间内完成它?
谢谢