以固定容量查找所有可能的段倾斜

时间:2017-11-23 01:27:22

标签: algorithm optimization

我正在寻找一种有效的(比我的组合搜索更有效)算法来平铺字符串片段。

我有两件事:

  • 要覆盖的“区域”的长度;
  • 一组段(段由开始和结束索引以及标签定义)

实施例: 区域的总长度为5.给定的段是:

- [(0,2), "A B"]
 - [(1,3), "B C"]
 - [(1,4), "B C D"]
 - [(3,5), "D E"]

我使用Python表示法来表示段,例如(0,2)及其标签“A B”是一个字符串。

有三种方法可以填充大小为5的“区域”,给定的段没有重叠:

 1. ("A B"), ("D E")
 2. ("B C"), ("D E")
 3. ("B C D")

其他倾斜是不可能的,因为额外的部分将与已经位于“区域”的现有瓷砖重叠。

我目前的做法是从一个细分市场开始,看看我得到了多少个非重叠细分的组合。然后是两个段,依此类推至4.如果无法添加任何剩余段,则检查每个组合有效性。如果可以插入任何剩余的段,则整个组合将被拒绝为无效。 当没有很多段并且几乎没有重叠/组合时,这种方法非常有效。

是否有一种简单而有效的算法来找到这些“倾斜”?

1 个答案:

答案 0 :(得分:0)

有一种动态编程方法,您可以沿着要覆盖的区域从左到右工作,并在每个点处计算出在该点整齐地完成的倾斜次数。要计算这一点,请查看覆盖该点并在该点结束的段。对于这些段中的每一段,以该段结束的倾斜数是在该段开始之前结束的倾斜数,并且您已经计算了该数。因此,将这些数字相加以获得覆盖该点并在该点结束的倾斜数。你想要的答案是覆盖要覆盖的区域中的终点并在该点结束的倾斜次数(假设想要整齐地结束或将被强制结束)。

如果您只想要一个可能的倾斜,您​​不需要计算在每个点终止的倾斜次数,您只需要一个标记来判断是否有任何倾斜在该点终止。如果您还记下了在平铺终止的每个点,那么在该点处终止的平铺以便其中一个倾斜,这样可以更容易地检索可能的平铺。

现在你可以找出一条可以平铺整条线的瓷砖。查看字符串中最后一个字符的条目。这将为您提供结束该平铺的段。鉴于该段,您知道它的长度。如果它的长度为3,并且最后一个偏移量偏移为10,则必须有一个终止于偏移量7的有效平铺。您将注意到终止于偏移量7的段,这将为您提供所需平铺中的倒数第二段。通过查看该段的长度,您可以找出在此之前查找段的注释的位置,依此类推,直到您从右到左恢复整个平铺。