大矩阵中的簇数

时间:2013-01-21 16:02:31

标签: python algorithm matrix

我需要在矩阵中聚集所有数字(在一个簇中可以是具有相同值的数字,例如只有5),而不是传递和返回字典,如

    {number1:[[(3,4),(4,5)],[]..], number2:...}#I am using Python

我可以遍历行和列,当我发现数字不同于传递的数字x时,我开始填充并创建聚类并记住访问位置,以避免双重相同的聚类,并且它可以工作。我想知道有没有人有更好的想法,更快?

FOR例子(我想聚集所有不同于1的数字)     通过值1

2  1  1  2
2  1  2  2 
1  1  3  3

我会得到{2:[(0,0),(1,0)],[(0,3),(1,2)(1,3)],3:[(2,2) ,(2,3)]}

2 个答案:

答案 0 :(得分:1)

让我们将单元格值分类为target valuereplacement value(s),其中target value的单元格是您要修改的单元格。您想要使用replacement value(s)对其进行聚类。在您的示例中,这些值分别为1和(2,3)。

洪水填充的一个常见应用是,将replacement value(s)的单元格更改为target value的单元格,例如油漆应用中的桶填充工具。如果这是您的用例,您可以在每次访问单元格时更改单元格值,从而无需记住您之前是否访问过该单元格。我假设那不是你的用例。

方法#1:使用字典

我会使用带有访问单元格的(row,col)字典作为键。既然你想看看你是否访问过(row,col),你可以用O(1)时间复杂度来做。您的方法需要首先转到特定的replacement value键,然后遍历列表以查找(当前行,当前col)是否存在于其中。它的时间复杂度与O(k)成正比,其中k是列表中元素的数量。在最坏的情况下,它将是O(RxC),其中RxC是矩阵的维数。

方法#2:使用bool矩阵

另一种简单的方法是使用类型为bool的矩阵,其尺寸与单元格值矩阵相同。每次访问单元格时,请将其标记为True。您可以在O(1)中检查是否已访问过某个单元格。

在最坏的情况下,上述两种数据结构都具有O(RxC)的空间复杂度。我假设这很好,因为你已经有一个单元格值相同的矩阵。

答案 1 :(得分:1)

您是否考虑过使用numpy.where()?如果您可以将数据放入数组中,则只需使用:

 import numpy as np
 data=np.array(<some data>)
 np.where(data!=2)

获取不等于2的元素的indeces。就此而言,numpy数组的工作与直接比较,如

 data > 5

将返回比较为真的布尔数组,并且:

 data[data > 5]

将返回比较为true的值,这样您甚至可能不需要numpy.where()。

相关问题