给定一组N维整数点,我如何找到N维长方体的最小集合(2-d情况下的矩形),这样整数点在整数点集合中当且仅当它包含在一个或多个长方体/矩形中。 整数点表示具有整数坐标的点。
e.g。给定点(1,0),(2,0)和(3,1),(4,1),最小的矩形集是(1,0-2,0),(3,1-4,1) ),见下图:
2 ..... 1 ...## 0 .##.. 01234
显然我可以进行暴力搜索,但我正在寻找一种更有效的算法,即使它仍然具有很高的复杂性。
答案 0 :(得分:2)
一般情况是NP难:
http://www.computer.org/portal/web/csdl/doi/10.1109/SFCS.1988.21976
看起来它可以近似为O(log N)。在线查看“NP优化问题概要”,搜索“MINIMUM RECTANGLE COVER”
此外,可能仍然可以有效地解决您的特定用例。
答案 1 :(得分:1)
有许多方法可以找到现有的点:
将点放入哈希映射中以便快速查找。对于一般情况,这可能是最好的方法,在这种情况下,如果您尝试收集它们,您将无法知道这些点将留下多少个洞。在最坏的情况下,每个点你会得到一个矩形。
如果您有一个或几个Z坐标,请收集位图中的点(1位深度)。只需打开位图中的像素即可。
如果您确实需要收集矩形中的点,则必须先将它们放入有序集(通过坐标)。多次迭代这个集合。每次,取出第一个点。然后寻找你已经拥有的那个左/右邻居的任何一点。如果有,请将它们连接到(水平)线。当你获得更多积分时,增加这条线。
当没有剩下的点时,对于生长矩形的线也一样。
答案 2 :(得分:1)
我假设您愿意容忍重叠的矩形,因为如果这些点是
4 .###.
3 ..#..
2 .###.
1 ..#..
0 .###.
01234
然后你可以覆盖四个重叠的矩形,但需要五个不重叠。
这个算法怎么样:
对于每个点,找到包含该点的最大矩形。最大的矩形是一个不能做得更大但仍然只是覆盖点的矩形。如果有两个最大的矩形,只需选择一个。将最大的矩形存储在某种删除重复项的数据结构中。在完成对所有点的迭代后,矩形集必须覆盖所有点。
我不知道这实际上是否是一组最小的矩形,但我怀疑它是。
请注意,在上面的示例中,您将获得三个矩形:一个垂直和两个水平。