Algorithm 区间的覆盖并集

Algorithm 区间的覆盖并集,algorithm,indexing,Algorithm,Indexing,我正试图实现一个问题的解决方案,这个问题归结为区间覆盖。 通过谷歌搜索,我知道这通常是用贪婪的方法解决的,但我自己的第一个想法是使用广度优先搜索。我开始假设区间的并集是一个区间,并且所有区间都是闭合的。问题是: 给定k个闭区间,找到一个元素尽可能少的子集 可能的情况是,从原始集合开始的间隔中的每个点 在找到的子集的某个时间间隔内 我的想法是在一个图中工作,其中间隔是顶点和两个顶点 如果相应的间隔重叠,则形成无向边。在特殊情况下 如果并集是一个间隔,我可以选择包含终点和起点的节点 具有最大长度,然

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

给定k个闭区间,找到一个元素尽可能少的子集 可能的情况是,从原始集合开始的间隔中的每个点 在找到的子集的某个时间间隔内

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

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


但是这里不需要普通的最短路径算法(比如Dijkstra)。从第一个间隔开始(起点最低的间隔)。然后选择一个间隔,该间隔在该间隔之后开始,且其终点最高。重复以上步骤直到结束。

据我所知,我回答这个问题是因为之前的条目回答不正确或不完整

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

  • 以升序将线段按左端排序,通过优先考虑右端最大的线段来断开连接(断开连接实际上并不重要)
  • 从“左到右”应用贪婪策略:

    2.1在不缺少点的情况下,强制选择左端最大的线段

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

    2.3否则,请转至2.1

  • 步骤1的时间复杂度为O(N logn),步骤2的时间复杂度为O(N)。因此,这种贪婪算法需要O(N logn)时间


    希望这有帮助

    带有两个集合(开始/结束)且指针指向同一边缘的变体是否没有为您带来正确的性能?我希望我不必首先构建完整的图形。如果可以避免预构建,我认为广度优先的解决方案更简单,因为它更容易证明正确性。只有在被迫休息时才休息。以取一为条件,尽可能远。好吧,也许你可以写出证明?我认为贪婪不起作用,因为不管是省略的区间集还是取的区间集,都必须定义拟阵。我可以很容易地证明,省略的间隔集不是。贪婪可能会找到一个好的解决方案,但不是最优的。也许有人能计算出竞争力。