使用链接列表表示矩阵类

时间:2015-07-19 21:02:14

标签: matrix linked-list

我根据输入的参数初始化矩阵的链表时遇到问题。因此,如果我输入参数(3,3),它实际上应该使make 4x4,所以我可以使用第一列和第一行进行索引。和左上角节点作为入口点。

def __init__(self, m, n, default=0):
        self._head = MatrixNode(None)
        for node in range(m - 1):
            node = MatrixNode(0)
            node._right = node
        for node in range(n - 1):
            node = MatrixNode(0)
            node._down = node

这是我到目前为止所做的,但我确定它太可怕了。

2 个答案:

答案 0 :(得分:0)

首先,知道MatrixNode是什么可能很有用。我猜你只想在那里存储一个值?

然后我看到两个线性循环,而矩阵是一个n * m数据结构。您确定,您的循环不需要嵌套来正确初始化您的结构吗?

对于链接列表,我希望有类似row.next = nextrowrow.startnode.next = nextnode的内容,我在这里看不到这样的内容。

说完这个,我想问你,如果你真的想自己实现一个矩阵,并且采用这种面向对象(效率低下!)的方式。

你可以使用二维数组(a=[[1,2], [3,4]];a[0][0]==1)或数字库中的一个很好的实现,比如numpy / scipy。

你有numpy.array用于存储n维数据(具有良好的寻址,如matrix[1,2]和类似于matlab的语法)或numpy.matrix,就像一个数组,其中一些方法被重载为矩阵操作(即数组的矩阵 - 矩阵乘法是逐点的,对于矩阵,它是通常的矩阵乘法)。

答案 1 :(得分:0)

你是对的,它太可怕了:) 首先,链表是表示矩阵的一种非常糟糕的方式。 如果你想表示一个矩阵,请从列表列表开始,如果那还不够,可以从那里开始工作(例如,参见提及numpy的其他答案)

如果您想学习使用链接列表,请选择一个更好的示例。

然后:您正在重新使用变量名称" node"对于不同的事情:

  1. 您的循环索引。代码for node in range(...)将在每次迭代中将范围中的整数分配给node

  2. 然后您将新的MatrixNode分配给node,然后将节点的邻居(_right或_down)设置为不是实际的邻居,而是自己(node._right = node )。

  3. 您也永远不会将您在循环中创建的节点保存在任何地方,因此它们将被垃圾收集。

    你永远不会使用可选参数default