最小化合并行的垂直和的算法

Algorithm to minimize vertical sum of binned rows

我遇到了一个问题,我正在尝试为其寻找算法。如果有任何建议,我将不胜感激。

我有 n 行,长度为 m。这些行具有具有一些预期总和的二进制 (0,1) 值。只要总和符合预期,1 就可以放在其行中的任何位置。目标是最小化长度为 m 的每一列的垂直总和。

例如,如果我们有 4 行和 10 列,则预期总和为:

Row 1: 6

Row 2: 7

Row 3: 4

Row 4: 5

可能的解决方案可能是:

1 1 1 1 1 1 0 0 0 0

1 1 1 0 0 0 1 1 1 1

1 0 0 1 1 1 0 0 0 0 

0 1 0 0 0 0 1 1 1 1

获取垂直总和:

3 3 2 2 2 2 2 2 2 2

反对把所有的都放在开头的大数:

1 1 1 1 1 1 0 0 0 0

1 1 1 1 1 1 1 0 0 0

1 1 1 1 0 0 0 0 0 0

1 1 1 1 1 0 0 0 0 0

总和为:

4 4 4 4 3 2 1 0 0 0

所以,我正在尝试分散负载。我的行数将进入 millions/billions,因此我希望使用线性代数方法而不是迭代方法。谢谢!

def create_min_vert_matrix(num_r, num_c, arr_sum_rows): 
    res = [] 
    curr = 0 
    for r in range(num_r): 
        row = [0]*num_c 
        while arr_sum_rows[r] > 0: 
            arr_sum_rows[r] -= 1 
            row[curr] = 1 
            curr = (curr+1)%num_c 
        res.append(row) 
    return res

快速测试:

create_min_vert_matrix(4, 10, [6,7,4,5])                                                                       
[[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],
 [1, 1, 1, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],
 [1, 1, 0, 0, 0, 0, 0, 1, 1, 1]]

该函数采用行数 num_r、列数 num_c 和一个数组,该数组说明每行中的总和必须是多少(arr_sum_rows).

我们的想法是,如果我们尽可能均匀地按列分布,我们就能够最小化列总和。为了做到这一点,我们跟踪最后一列我们插入一个,curr,并且对于每个插入的一个增加它。如果它增长大于我们将其设置为零的列数:curr = (curr+1)%num_c.

算法在 O(n*m) 中运行,其中 nm 是矩阵的行数和列数,如果我们 O(1) 额外 space不要计算结果所需的辅助 space(当然还有 O(n*m) 额外的 space)。