在处理图像处理任务时,我遇到了以下问题:单位正方形中有n个点,分别具有坐标$x_i$和$y_i$,每个点都赋予一个正或负权重$w_i$。找到一个矩形,使得该矩形内的所有点的权重之和为正且最大。
通过定义一个适当的网格,可以将问题重新表述为在一个n×n矩阵A中找到一个子矩阵,其元素之和最大。这也被称为“最大子矩形问题”,并已经在SO上讨论过。虽然暴力方法的运行时间为O(n^5),但有一种巧妙的解决方法,其运行时间为O(n^3)。它利用了对应一维问题的解决方案,称为"最大子数组问题", 其运行时间为O(n)。
我已经在R中实现了这两种算法,并且可以在几秒钟内解决数百个点。但是对于成千上万个点,它将太慢了,即使将循环外包给一些Fortran或C代码。
现在看一下矩阵A。假设(没有丧失一般性),所有点的x或y坐标都不同,A具有特殊形式:在A的每一行和列中,恰好有一个非零元素。对于具有这种特殊属性的矩阵,我认为应该有一种算法可以在O(n^2)时间内执行任务,甚至更好。
这里是添加最佳矩形的示例:
你会发现在最优矩形中可能出现红色,即负数点。这也表明仅解决 x 和 y 坐标的一维情况是不够的。
我将把标准解法翻译成Fortran,但我肯定希望能掌握更有效的算法。
通过定义一个适当的网格,可以将问题重新表述为在一个n×n矩阵A中找到一个子矩阵,其元素之和最大。这也被称为“最大子矩形问题”,并已经在SO上讨论过。虽然暴力方法的运行时间为O(n^5),但有一种巧妙的解决方法,其运行时间为O(n^3)。它利用了对应一维问题的解决方案,称为"最大子数组问题", 其运行时间为O(n)。
我已经在R中实现了这两种算法,并且可以在几秒钟内解决数百个点。但是对于成千上万个点,它将太慢了,即使将循环外包给一些Fortran或C代码。
现在看一下矩阵A。假设(没有丧失一般性),所有点的x或y坐标都不同,A具有特殊形式:在A的每一行和列中,恰好有一个非零元素。对于具有这种特殊属性的矩阵,我认为应该有一种算法可以在O(n^2)时间内执行任务,甚至更好。
这里是添加最佳矩形的示例:
set.seed(723)
N <- 50; w <- rnorm(N)
x <- runif(N); y <- runif(N)
clr <- ifelse (w >= 0, "blue", "red")
plot(x, y, pch = 20, col = clr, xlim = c(0, 1), ylim = c(0, 1))
rect(0.075, 0.45, 0.31, 0.95, border="gray")
你会发现在最优矩形中可能出现红色,即负数点。这也表明仅解决 x 和 y 坐标的一维情况是不够的。
我将把标准解法翻译成Fortran,但我肯定希望能掌握更有效的算法。