我正在尝试实现一个问题的解决方案,归结为间隔覆盖。 通过谷歌搜索我知道通常这是使用贪婪的方法解决,但我自己的第一个想法是使用广度优先搜索。我开始假设间隔的并集是一个间隔,所有间隔都是关闭的。问题是:
给定k个闭合区间,找到一个元素少的子集 可能使得原始集合的间隔中的每个点都成为可能 是在找到的子集中的区间。
我的想法是在图形中工作,其中间隔是顶点和两个顶点 如果相应的间隔重叠,则形成无向边。在特殊情况下 union是一个区间,我可以选择包含结束点和起点的节点 具有最大长度然后在这些最小长度之间的路径是最佳解决方案。 我的问题是:如何有效地构建区间图,以便我避免查看每对区间。我已经尝试了不同的方法来对间隔进行排序,但我仍然没有摆脱二次时间。
答案 0 :(得分:1)
我认为在最坏的情况下,你无法摆脱二次时间。那是因为边数可能是二次的。
但这里不需要正常的最短路径算法(如Dijkstra)。从第一个间隔开始(具有最低开始的间隔)。然后选择一个在此之后开始并且结尾最高的区间。重复直到你结束。
答案 1 :(得分:0)
我正在回答这个问题,因为根据我的知识,之前的条目没有正确回答或者不完整。
有一种算法在O(N log N)上运行,其中N是封闭段的数量:
从"从左到右应用贪婪策略":
2.1虽然没有错过一个点,但强制选择左端最大的段
2.2如果缺少一点,则没有解决方案。
2.3否则,请转到2.1
步骤1的时间复杂度为O(N log N),步骤2的时间复杂度为O(N)。因此,这种贪心算法需要O(N log N)时间。
希望这有帮助!