具有固定长度的圆形聚类

时间:2013-06-24 18:41:32

标签: algorithm scheduling intervals

假设我有一个循环时间轴(24小时周期),在这24小时内有n个点。我想用给定固定长度k(<24h)的间隔覆盖所有点,并且我想尽可能少地使用间隔。是否有一个很好的算法来确定最佳区间的起点?

如果我们不允许间隔“环绕”那么它变得容易(我们可以简单地贪婪地安排第一个间隔从第一个点开始,覆盖尽可能多的点并选择下一个间隔的下一个间隔等)。

一个天真的二次解决方案是尝试将每个点作为“第一”间隔的起点并按上述方式行事,但我觉得我们可以做一些更聪明的事情吗?

3 个答案:

答案 0 :(得分:1)

请注意您建议的天真二次解:您需要将每个点视为间隔开始或间隔结束。


我不确定这是最佳解决方案,但它比天真的二次方更好:

让我们将点命名为 {P1,...,Pn}

由于任何点必须至少覆盖一个间隔,找到可能覆盖点 P1 的所有间隔(假设间隔从Pi开始,或在 Pi )。对于每个这些时间间隔,请像在线性时间轴上一样贪婪地继续。

要进一步优化它,而不是从 P1 开始,我们需要找到最佳起点 - 这可能是最小间隔数所涵盖的点。我不知道我们是否可以在线性时间内做到这一点,但一个好的启发式方法可能是从它与两个邻居的距离之和最大的点开始。

编辑:找到最佳起点的O( nlogn )方式:

我们可以建立一个可能 2n 段的列表(对于任何点 Pi ,间隔可以从 Pi 开始,也可以在)。接下来,将这些间隔插入segment tree

不要使用常规的分段树,而是将间隔存储在规范子集中,只需存储它们的数量(参见维基百科文章中的注释部分)。

树构造需要O( nlogn )时间。现在,对于每个点 Pi ,计算它落入的段(间隔)的数量。对于每个点,这将采用O( logn ),或者总计为O( nlogn )。

选择间隔数最少的点。如上所述,对于每个区间继续贪婪方法。

答案 1 :(得分:1)

简单的答案是......约束编程:

  1. 给你一组P分(比如午夜分钟)和k分区长度
  2. 你想要长度为k的最小间隔数(一个表示间隔开始的集合),以便

    一个。对于所有p elem P,存在S st p> = s&amp;&amp; p&lt; = s + k,在单词中所有给定的点都被“覆盖”(如果你想要它只是在s + k上使用mod)

    湾对于所有S,不存在S',S'中的元素数量小于S中的元素数量,结果集中的基数最小。

  3. 将其输入地理代码......然后就完成了。

    对于区间有各种可能的表示,在K Apt的书“约束编程原理”中很好地解释了权衡。

答案 2 :(得分:0)

也许你可以使用空间填充曲线和带有quadkeys的分层集群。有一个法国网站按照空间填充曲线排序日期:http://lapin-bleu.net/riviera/?p=78。但是二次算法的探究是什么?