找到一系列间隔

时间:2016-11-18 10:39:42

标签: algorithm optimization dynamic-programming

我有一个应用程序,我有一系列非重叠的固定宽度间隔,每个间隔都有一个给定的密钥。每个间隔具有相同的宽度,并且可能存在连续的间隔。基本上我想以这样的方式对间隔和键进行分组,以便最小化单独间隔的数量。这可以通过将相邻的间隔与相同的键合并或者寻找匹配的间隔并将它们组合成具有多个键的单个间隔来完成。我当前的算法尝试上述两种方法,看看哪个结果的间隔最小,但我觉得必须有更聪明的方法来解决问题。任何建议将不胜感激!

例如:

| ----- | | ----- |密钥k1的间隔(连续)

| ----- |密钥间隔k2

| ----- |键间隔k3

在这个问题中,密钥k1的间隔可以合并为一个连续的间隔,从而产生3个而不是4个总间隔。或者,每个密钥k1,k2和k3的第一个间隔可以与密钥k1,k2和k3组合成一个间隔,从而在k1中产生一个间隔加上第二个剩余间隔。

最糟糕的情况是70,000个区间。

1 个答案:

答案 0 :(得分:0)

良好逼近解决方案的想法。由于固定宽度输入数据的间隔可以表示为位掩码,其中一个(X)轴上具有间隔,而另一个(Y)轴上具有键。对于你这样的数据:

k3  1  0
k2  1  0
k1  1  1
   i1 i2

问题类似于分区rectilinear polygon问题。有一个非常好的答案涵盖了topic

这不是确切的问题,因为在这种情况下,键的顺序并不重要,可以在示例中看到:

k3  1  1
k2  1  0
k1  1  1
   i1 i2

分区将产生具有3个矩形的查找结果,解决方案应为2。

对此(或近似)的简单解决方案是在相同的间隔上进行输出后处理和连接矩形。这将有助于重新排序密钥的预处理,以便具有类似“覆盖”的密钥。更近或邻居。

更复杂的解决方案(我不是100%它的工作原理)是使用算法中的思想来划分直线多边形。想法是:

  • 采取所有可能的分裂(绳索),
  • 创建带有绳索的图形作为顶点和绳索相交的边缘,
  • find maximal(cord)independent set

在原始情况下,每个内部(270度)角在两个方向上产生两根绳索。由于按键排序并不重要,我认为Z线应该经过整个几何形状。这意味着绳索是:

  • 一个键继续间隔(X方向)
  • 间隔结束(Z方向,遍历整个几何体)。