所以,是否通过先解决情况(N,1)以获得N-1个矩形,然后解决情况(N-1,1),得到N-2个矩形,一直减少到N-r个矩形来解决原始问题?我希望看到这种乐观尝试程序的明确反例。如果该程序有效(请证明!),那将更有趣。
如果r固定为某个值r>1,而N很大,这个问题是否属于NP类之一?
谢谢任何关于此的想法。
David
r := N-2
。也就是说,您想查找最大重叠的两个矩形。假设您有两个覆盖相同面积(=最大重叠)的矩形。这两个将最终成为最佳结果。附言。这个方法还有很多不足之处,但可能会激发一些想法。特别是在一个象限中存在靠近X轴和Y轴的离群值时,它们会互相加强,就像它们都在45度角上一样,将解决方案推离该象限,这种方式可能没有意义。
-
如果r比N小很多,而N又相当大,请考虑以下内容:
找到平均中心点。
按照(X-center.x)+(Y-center.y)和(X-center.x)-(Y-center.y)将矩形排序为2个序列,其中X和Y是每个矩形的中心。
对于任何解决方案,所有拒绝的矩形都将成为最多4个子序列的成员,每个子序列都是每个2个序列的头或尾。假设N比r大得多,大部分时间将用于排序序列-O(n log n)。
要找到解决方案,首先找到通过删除每个序列的头和尾处的r个矩形所给出的交集。使用此基本交集来消除您知道将在解决方案中的“核心”矩形集的考虑。这将将交集计算减少到仅使用最多4 * r + 1个矩形。
每个4个序列头和尾应与一个r个矩形的数组相关联,每个条目表示通过将“核心”与头或尾的i个最内部矩形相交所给出的交集。此预计算将将查找解决方案的复杂性从O(r^4)降低到O(r^3)。
这不是完美的,但应该很接近。这里提供了一个明确的反例(当N=4且r=2时),来反驳提问者提出的贪心算法。
这些矩形中任意三个之间的最大交集在黑色、蓝色和绿色矩形之间。但是,很明显,任意两个之间的最大交集都小于黑色和红色矩形之间的交集。
我相信这会产生一个完美的解决方案。 David的解决方案更容易实现,并且在大多数情况下应该更快。
这基于这样一个假设,即对于任何解决方案,至少有一个拒绝必须是复合壳体的成员。 递归应用导致:
计算凸包。 通过以下方式收集所有候选解:
{Remove a hull member, repair the hull} r times
(上次船体实际上不需要修理。)
如果h是初始船体成员的数量,则复杂度小于h^r,再加上计算初始船体的成本。我假设选择一种船体算法,使得排序后的数据可以在船体维修中保持并重复使用。
我现在有一个算法,与Ed Staub的算法非常相似,具有相同的时间估计。它与Ed的有点不同,因为它适用于所有r。
mhum对贪心算法的反例很好。看一下。
所以我的算法时间复杂度为O(N log(N)) + O(r^3)。