假设我有一个区间(a,b)和一些子区间{(a i ,b i )} i 其结合是(a,b)的全部。是否有一种有效的方法来选择这些子区间的最小基数子集,这些子集仍然涵盖(a,b)?
答案 0 :(得分:14)
从a或b开始的贪婪算法总能提供最佳解决方案。
证明:考虑覆盖a的所有子区间的集合S a 。显然,其中一个必须属于最佳解决方案。如果我们用来自S a 的子区间( max ,b max )替换它,其右端点b max 在S a 中最大(到达最右边),剩余的未覆盖间隔(b max ,b)将是最优解的剩余间隔的子集,因此,与最佳解决方案中的类似未覆盖间隔相比,它可以不再覆盖子间隔。因此,由(a max ,b max )构造的解决方案和剩余间隔(b max ,b)的最优解也将是最佳的。
所以,只需从a开始并迭代选择最右边的间隔(并覆盖前一个间隔的结束),重复直到你点击b。我相信如果将间隔存储在扩充间隔树中,则可以在log(n)中选择下一个间隔。
答案 1 :(得分:1)
听起来像动态编程。
以下是算法的说明(假设区间在按结束时间排序的列表中):
//works backwards from the end
int minCard(int current, int must_end_after)
{
if (current < 0)
if (must_end_after == 0)
return 0; //no more intervals needed
else
return infinity; //doesn't cover (a,b)
if (intervals[current].end < must_end_after)
return infinity; //doesn't cover (a,b)
return min( 1 + minCard(current - 1, intervals[current].start),
minCard(current - 1, must_end_after) );
//include current interval or not?
}
但它也应该涉及缓存(memoisation)。
答案 2 :(得分:0)
有两种情况需要考虑: 情况1:在间隔结束时间之后没有重叠间隔。在这种情况下,选择具有最小开始时间和最长完成时间的下一个间隔。 (amin,bmax)。 情况2:您正在查看的最后一个间隔有1个或多个重叠间隔。在这种情况下,开始时间无关紧要,因为您已经涵盖了这一点。因此优化完成时间。 (a,bmax)。
案例1总是选择第一个区间作为最优组中的第一个区间(证明与@RafalDowgrid提供的相同)。
答案 3 :(得分:-2)
你的意思是,子区间仍然重叠,使得(a,b)在所有点上完全被覆盖?
可能将子区间本身拆分为与它们来源相关的基本块,因此您可以列出每个基本块间隔的选项,同时也考虑子区间所涵盖的其他区域。然后,您可以使用基于每个子子区间的搜索,并且至少确保没有剩余间隙 然后需要有效地搜索..那将更难。
可以消除任何由另一组较小数字完全覆盖的间隔集合,并在预处理后解决问题。
至少有一半,整体的最低限度是不是很小?我不确定。
找到期刊link,但无法阅读。 :(
这将是一个hitting set问题,一般都是NP_hard 无法阅读this,但看起来像是相反的问题 无法阅读,但另一个link提到了分割间隔 Here是关于GeometricOptimization问题的随机算法的可用参考 这个pdf的页面35有一个贪婪的算法 Karp (1972)的第11页提到了击中,并引用了很多 Google result。研究很有趣但我现在必须走了。