在矩阵中搜索零的最大路径

时间:2017-04-08 08:21:35

标签: arrays performance list python-3.x matrix

给定10 x N矩阵的1&0和0,例如:

1 1 1 1 1 1 1 1
1 1 0 1 1 0 0 1
0 0 0 1 1 0 0 1
0 0 0 1 1 0 0 0
1 0 0 0 0 1 0 0
1 0 1 1 1 1 1 1
1 0 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

注释:

  • 中的零总是在连续1次的两次运行之间。例如,不允许使用,例如1 1 1 0 1 0 1 1 1 1

  • 每个必须至少有一个零间隔,即,例如:1 1 1 1 1 1 1 1 1 1不允许

我想从左到右找到最长的零连续条纹。在这种情况下,那将是4,它对应于从顶部开始的第5行的第二列开始的路径,

第二长的是3,其中有3个例子。

我有点难过,特别是对于非常大的N(~10M)。我正在寻找正确的方法/数据结构使用的建议或类似的问题和那里使用的算法。建模问题的另一种可能方法是使用两个列表来表示问题:

L1 = [2, 2, 1, 4, 4, 1, 1, 3]
L2 = [6, 3, 5, 5, 5, 5, 5, 5]

但仍不太确定如何提出有效的解决方案

1 个答案:

答案 0 :(得分:2)

使用itertools.groupby()sum()max()函数的解决方案:

import itertools

m = [
    [1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 0, 1, 1, 0, 0, 1],
    [0, 0, 0, 1, 1, 0, 0, 1],
    [0, 0, 0, 1, 1, 0, 0, 0],
    [1, 0, 0, 0, 0, 1, 0, 0],
    [1, 0, 1, 1, 1, 1, 1, 1],
    [1, 0, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1]
]

max_zero_len = max(sum(1 for z in g if z == 0) 
                   for l in m for k,g in itertools.groupby(l))

print(max_zero_len)

输出:

4

for l in m for k,g in itertools.groupby(l) - 将为每个嵌套列表的10值的每个连续序列生成一个单独的组。 (如[1,1], [0], [1,1], [0,0] ...

sum(1 for z in g if z == 0) - 仅考虑0个序列,并使用sum函数计算其长度

max(...) - 获取零(0)个序列中的最大长度