覆盖间隔的联合

时间:2011-09-25 09:55:47

标签: algorithm indexing

我正在尝试实现一个问题的解决方案,归结为间隔覆盖。 通过谷歌搜索我知道通常这是使用贪婪的方法解决,但我自己的第一个想法是使用广度优先搜索。我开始假设间隔的并集是一个间隔,所有间隔都是关闭的。问题是:

  

给定k个闭合区间,找到一个元素少的子集   可能使得原始集合的间隔中的每个点都成为可能   是在找到的子集中的区间。

我的想法是在图形中工作,其中间隔是顶点和两个顶点 如果相应的间隔重叠,则形成无向边。在特殊情况下 union是一个区间,我可以选择包含结束点和起点的节点 具有最大长度然后在这些最小长度之间的路径是最佳解决方案。 我的问题是:如何有效地构建区间图,以便我避免查看每对区间。我已经尝试了不同的方法来对间隔进行排序,但我仍然没有摆脱二次时间。

2 个答案:

答案 0 :(得分:1)

我认为在最坏的情况下,你无法摆脱二次时间。那是因为边数可能是二次的。

但这里不需要正常的最短路径算法(如Dijkstra)。从第一个间隔开始(具有最低开始的间隔)。然后选择一个在此之后开始并且结尾最高的区间。重复直到你结束。

答案 1 :(得分:0)

我正在回答这个问题,因为根据我的知识,之前的条目没有正确回答或者不完整。

有一种算法在O(N log N)上运行,其中N是封闭段的数量:

  1. 按照升序排列左边的段,通过优先考虑那些具有最大权利的人来打破联系(打破关系真的无所谓)。
  2. 从"从左到右应用贪婪策略":

    2.1虽然没有错过一个点,但强制选择左端最大的段

    2.2如果缺少一点,则没有解决方案。

    2.3否则,请转到2.1

  3. 步骤1的时间复杂度为O(N log N),步骤2的时间复杂度为O(N)。因此,这种贪心算法需要O(N log N)时间。

    希望这有帮助!