尝试实现路径查找算法,该算法在矩阵中查找相邻的True
值,并将它们连接到单个路径中。并查找矩阵中的所有独立路径。元素仅为1
s或0
s
示例:
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]
]
我想了两种方法:
- 检查一行中元素的数量,如果达到末尾,则跳过它。使用
if
和cols[row]
,其中cols
表示每列中的元素数量,row
是当前行:cols = [len(row) for row in matrix]
- 填充"丢失的";具有
0
s的元素得到row * column
矩阵
尽管这些方法可能适用于相对较小的矩阵,但问题会出现在较大的数字上,例如
如果其中任何一行具有50k个元素,而所有其他行具有约1k个,则需要将n
行填充49k
次(第二种方法(。使用第一个,在最坏的情况下(0
s和1
s交替出现(,检查将发生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分组为每行的块。您可以尝试自己找出一个实现。