算法 - 在矩阵中求和

时间:2016-02-23 18:54:06

标签: algorithm matrix time sum

我们给出了2D矩阵阵列(让我们说长度为i和宽度为j)和整数k 我们必须找到最小矩形的大小,包含这个或更大的总和 F.e k = 7

4 1
  1 1
  1 1
  4 4

Anwser是2,因为4 + 4 = 8> = 7,如果没有最后一行,则anwser将是4,4 + 1 + 1 + 1 = 7> = 7

我的想法是计算前缀和Pref [k,l] = Tab [k,l] + Pref [k-1,1] + Pref [k,l-1] 然后比较每个矩形

这可以让它更快吗?我的想法是T(n)= O(n ^ 2)(其中n是矩阵中元素的数量) 我想在时间n或n * log n

中这样做

如果有人能给我任何提示怎么做,我会很高兴:)

1 个答案:

答案 0 :(得分:1)

首先,创建辅助矩阵:sums,其中:

sums[i,j] = A[0,0] + A[0,1] + .... + A[0,j] + A[1,0] + ... + A[1,j] + ... + A[i,j]

我认为这就是你说“前缀矩阵”的意思。

这可以通过动态编程以线性时间计算:

sums[0,j] = A[0,0] + ... + A[0,j]
sums[i,0] = A[0,0] + ... + A[i,0]
sums[i,j] = sums[i-1,j] + sums[i,j-1] - sums[i-1,j-1] + A[i,j]
                                            ^
                                     elements counted twice

现在,假设所有元素都是非负数,这是非递减矩阵,其中每列和每一行都被排序。

因此,再次迭代矩阵,对于每对索引i,j,找到最接近但小于sum[i,j]-k的值。

This can be done in O(sqrt(n))

为每个此类(i,j)对执行此操作,并获得O(n*sqrt(n))解决方案。