我有一个网格图NxN。每个单元格可能具有值' 0' 0或者' 1'。我试图找到包含特定数量的' 1'这个数字可以在1到6之间。我曾想过搜索每个可能的矩形,但对于500x500大小的地图来说这是非常慢的,对于普通的台式计算机,解决方案必须是~1秒。有人可以告诉我一个相应的问题所以我可以找一个工作算法或更好的有人可以建议我这个问题的工作算法吗?提前谢谢大家!
答案 0 :(得分:2)
我想你对所有矩形的搜索都很慢,因为你实际上是在指望每个可能的矩形。对此的解决方案不是计算所有矩形,而是创建第二个NxN数组,其中包含矩形的计数(0,0..x,y),调用此OriginCount。然后,要计算任何给定矩形的计数,您将不必通过矩形和计数。你可以简单地使用
Count(a,b..c,d) = OriginCount(c,d) + OriginCount(a-1,b-1) -
OriginCount(a-1,d) - OriginCount(c,b-1)
这就解决了计算任何给定矩形中的问题的问题,从N 2 问题到离散或恒定时间问题,并且你的代码的速度提高了数千倍(对于你的500x500案例)
请注意,为了设置OriginCount数组,您可以使用相同的概念,不要只计算每个矩形的数字,从0,0到x,y。相反,使用公式
OriginCount(x,y) = OriginCount(x-1,y) + OriginCount(x,y-1) - OriginCount(x-1,y-1) +
GridMap(x,y) == 1 ? 1 : 0;
请注意,您必须考虑边缘情况 - 其中x = 0或y = 0.