分割2D矩阵

时间:2018-08-23 12:56:53

标签: algorithm matrix partitioning

请考虑以下2D矩阵:

0,0,0,0,0
0,0,1,0,0
0,0,0,1,0
0,0,0,0,0

我只能做从端到端边缘延伸的水平或垂直切割。

可以使用什么算法,这样我可以找出将矩阵分成2个部分多少次,从而使2个部分中的每一个都具有等于1的像元数目?

1 个答案:

答案 0 :(得分:1)

我假设您只能进行一个水平切割或垂直切割。

“一个单一矩阵” 的一种方法是:(您需要将此方法重复应用于获得的每个分区)。

计算每行的个数和每列的个数,将它们存储在两个数组中,例如

 $('#showChartModal').on('shown.bs.modal', function (e) {
    Chart.defaults.global.tooltips.enabled = true;
});

还要计算矩阵中1的总数,它实际上是上述两个数组中所有元素的值之和。

tooltips

例如,您可以像OnesInRow[num_rows] , OnesInColumn[num_cols] 这样获得行号2中的个数(假设行索引从0开始)。同样,第3列中的数字为total = Sum( All elements in OnesInRow )

现在考虑这样的水平切割:

0,0,0,0,0


0,0,1,0,0

0,0,0,1,0

0,0,0,0,0

在每个分区中获得的数量为:OnesInRow[1]

为此:

0,0,0,0,0

0,0,1,0,0


0,0,0,1,0

0,0,0,0,0

它是:OnesInCol[2]

为此:

0,0,| 0,0,0

0,0,| 1,0,0

0,0,| 0,1,0

0,0,| 0,0,0

它是:OnesInRow[0], Total - OnesInRow[0]

因此,您只需要考虑所有行剪切和列剪切,并采用其中哪些剪切将导致两个相等的分区。

Total - ( OnesInRow[0] + OnesInRow[1] ) , OnesInRow[0] + OnesInRow[1]

然后对于从这样的分区获得的每个矩阵,您可以递归地重复该过程,直到无法剪切,即数组中只有一个元素。 在每次递归时,您都维护一个count变量并对其进行更新。