描述一组整数点的最小矩形集

时间:2009-07-16 13:42:11

标签: graphics 3d geometry points rectangles

给定一组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

显然我可以进行暴力搜索,但我正在寻找一种更有效的算法,即使它仍然具有很高的复杂性。

3 个答案:

答案 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)

有许多方法可以找到现有的点:

  1. 将点放入哈希映射中以便快速查找。对于一般情况,这可能是最好的方法,在这种情况下,如果您尝试收集它们,您将无法知道这些点将留下多少个洞。在最坏的情况下,每个点你会得到一个矩形。

  2. 如果您有一个或几个Z坐标,请收集位图中的点(1位深度)。只需打开位图中的像素即可。

  3. 如果您确实需要收集矩形中的点,则必须先将它们放入有序集(通过坐标)。多次迭代这个集合。每次,取出第一个点。然后寻找你已经拥有的那个左/右邻居的任何一点。如果有,请将它们连接到(水平)线。当你获得更多积分时,增加这条线。

  4. 当没有剩下的点时,对于生长矩形的线也一样。

答案 2 :(得分:1)

我假设您愿意容忍重叠的矩形,因为如果这些点是

4 .###.
3 ..#..
2 .###.
1 ..#..
0 .###.
  01234

然后你可以覆盖四个重叠的矩形,但需要五个不重叠。

这个算法怎么样:

对于每个点,找到包含该点的最大矩形。最大的矩形是一个不能做得更大但仍然只是覆盖点的矩形。如果有两个最大的矩形,只需选择一个。将最大的矩形存储在某种删除重复项的数据结构中。在完成对所有点的迭代后,矩形集必须覆盖所有点。

我不知道这实际上是否是一组最小的矩形,但我怀疑它是。

请注意,在上面的示例中,您将获得三个矩形:一个垂直和两个水平。