宽度不等的"Matrix" - 高效的循环方式



尝试实现路径查找算法,该算法在矩阵中查找相邻的True值,并将它们连接到单个路径中。并查找矩阵中的所有独立路径。元素仅为1s或0s

示例:

matrix = [
[1, 0, 1, 0],
[1, 1, 0, 0],
[1, 0, 1, 1]
]

第一条路径:[(0,0), (1,0), (1,1), (2,0)]

第二路径:[(0,2)]

第三路径:[(2,2), (2,3)]

现在,这是非常直接的,但我想知道如何有效地在宽度不等的矩阵上循环。

示例:

matrix = [
[1, 0, 1, 0],
[1, 1, 0, 0],
[1, 0, 1, 1],
[1, 0, 0],
[0, 1]
[1, 0, 1, 0, 1, 1]
]

我想了两种方法:

  1. 检查一行中元素的数量,如果达到末尾,则跳过它。使用ifcols[row],其中cols表示每列中的元素数量,row是当前行:cols = [len(row) for row in matrix]
  1. 填充"丢失的";具有0s的元素得到row * column矩阵

尽管这些方法可能适用于相对较小的矩阵,但问题会出现在较大的数字上,例如

如果其中任何一行具有50k个元素,而所有其他行具有约1k个,则需要将n行填充49k次(第二种方法(。使用第一个,在最坏的情况下(0s和1s交替出现(,检查将发生49k/2次(因为每个1都是新路径,并且算法将查找相邻路径(。

我想知道是否有更有效的方法,检查尽可能少的";空白点";或者根本不检查它们。

在一般情况下,您可以像这样迭代行和列,而无需明确提及列宽。

for row in matrix:
for value in row:
...

对于您试图解决的这个特定问题,可能仍然需要记录前一行的长度:

last_row = None
last_row_len = 0
for row in matrix:
for idx, value in enumerate(row):
if idx >= last_row_len:
...
elif value and last_row[idx]:
...
last_row = row
last_row_len = len(row)

Python中更有效的解决方案可以使用itertools.groupby将0和1分组为每行的块。您可以尝试自己找出一个实现。

最新更新