【问题标题】:Searching for maximum path of zeroes in matrix在矩阵中搜索零的最大路径
【发布时间】:2017-09-03 15:30:49
【问题描述】:

给定一个由 1 和 0 组成的 10 x N 矩阵,例如:

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]

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

【问题讨论】:

  • N 有多大?
  • 由于数组中最多有 10 个零且只有 10,因此您可以创建所有行的字符串并检查所有行是否为 '0000000000' in row。如果不是,则继续使用 9 个零,依此类推。可能不适用于 10M 行。

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


【解决方案1】:

使用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) 个序列中的最大长度

【讨论】:

  • 如果你不是懦夫,请给出一些足够的论据来反对投票
  • 我没有投反对票,你能解释一下代码中发生了什么吗?
  • @dimebucker91,看我的解释
  • 我只是想创建一些具有更大 N 值的测试用例,您认为这对于如此大的输入如何工作?
  • 尝试做一个测试。作为替代方案,我们可以考虑使用numpy 模块
猜你喜欢
  • 2018-04-29
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2021-09-29
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多