将矩阵拆分为4个子矩阵,其总和之间的差异最小

时间:2014-02-22 13:47:16

标签: r algorithm matlab matrix graph

我必须找到4个子矩阵的总和之间的差异,这是我以任何方式分割矩阵 A 后得到的,以便得到子的总和之间的最小差异基质

例如,对于矩阵 A

 3   0   2  -8  -8
 5   3   2   2   3
 2   5   2   1   4
 3   4  -1   4   2
-3   6   2   4   3

我可以像这样分开它:

 3 | 0   2  -8  -8
 5 | 3   2   2   3
 2 | 5   2   1   4
 -------------------
 3   4  -1 |  4  2
-3   6   2 |  4  3

每个子矩阵中所有元素的总和给出以下结果:

10 | 8
-------
11 | 13

然后,我计算总和之间所有可能的绝对差异,即

abs(10 - 8)  = 2
abs(10 - 11) = 1
abs(10 - 13) = 3
abs(8 - 11)  = 3
abs(8 - 13)  = 5
abs(11 -13)  = 2

最后,我选择了最大距离 5

但是,如果我以任何其他方式分割矩阵 A ,它将给出不同的最大距离,这是我不想要的。我必须找到 5 ,但如果我要做这种蛮力,我只是花太多时间寻找所有可能性。这个问题有名字,或者你可以给我一个提示吗?

ADDED

允许的分割是水平分割,然后是上方的垂直分割,水平分割下方可能有不同的垂直分割。在该示例中,矩阵有4 x 4 x 4 = 64个允许分区。

特定分区的子矩阵之间的最大差异是通过考虑该分区的4个子矩阵的所有对(将有6个这样的对)并且取其中一个子矩阵的元素之和的最大差异而形成的。该对的一对和另一个子矩阵的元素之和。我们希望找到所有最大差异的最小值。

实际矩阵可能高达4000 x 4000。

1 个答案:

答案 0 :(得分:3)

在蛮力方面有一些加速。首先,通过沿行然后向下累加和,您可以构建一个表,为每个点提供所有点的总和,包括那个点,不比它更远,没有比它更右边。然后你可以通过减去这些小计中最多四个来计算任何矩形的总和:粗略地说出右上角的总和加上左下角的总和减去其他两个角的总和。

对于OP已经绘制的分割图案,水平线分割整个矩阵,然后在每一半中分割不同的垂直线,垂直分割必须是它们的一半最均匀的垂直分割。如果总和之间的最极端差异在垂直分割之内,那么晚上垂直分割只能改善它。如果总和之间的最极端差异在(例如)左上角的高和和右下角的低总和之间,那么晚上的任何一个垂直分割将使高总和下降或低总和,晚上外出最极端的差异。这意味着您只需要考虑上半部分中的最佳分割和下半部分中的最佳分割 - 您不需要考虑所有分割对。

对于在水平分割的同一侧有两个垂直分割的情况,您不必尝试垂直分割的所有位置对:您可以从最左侧的最左侧分割开始,然后调整最右边的分割,尽可能均匀地切割剩余部分。然后将最左边的分割缓慢向右移动,并且在执行此操作时,可以重复调整最右边的分割以向右移动,以便尽可能均匀地分割剩余部分。

使用这些想法,在我看来,对于每个可能的分割模式,您可以找到该模式的最小成本分割,给定该模式中最长线的位置,即O(N)边N的方矩阵,因此最长线的N个位置为O(N ^ 2),这与建立每个点下方和左侧点的总和所需的时间大致相同对于矩阵中的单元格总数,需要时间线性,或者对于N面的方阵,需要时间为O(N ^ 2)。但是,似乎有六种不同的分割模式是令人讨厌的。