使用链表在Java中表示稀疏矩阵

时间:2011-03-24 21:56:54

标签: java sparse-matrix

我正在制作一个小程序来表示稀疏矩阵(一个矩阵,其中许多元素等于零)。代表像this第108页(我想在图中观看就足以理解它)它正在使用链接列表。

[如果您理解图中],请不要阅读本段 它必须只存储不同的零元素,保存元素的行和列,并按如下方式链接它们。矩阵的第一个元素必须具有它的维度;它链接到一个节点,该节点表示元素不为零的第一行,并且该元素链接到两个节点:矩阵本身的元素(右边的链接)和下一行的元素不同为零。这样就构建了整个矩阵。

好的,我在思考每个班级的变量时遇到了问题。我有两个:NodeMatrix

public class Node {
    int row;
    int column;
    double value;
    Nodo columnLink;
    Nodo rowLink;
    Nodo nextRowLink;
}

public class Matrix{
    Nodo head;
    Nodo first;
    Nodo last;
}

这是最好的方式吗?我的意思是,当它是头节点时,它不会在value中存储任何内容,当它是非零元素时,它不会在nextRowLink中存储任何内容。我问的是内存使用,因为sparce矩阵的目的是不在内存中使用不必要的空间。什么意味着nextRowLink = null;?,value是一个原生变量,所以即使它是value = 0 or Double.NaN;也需要64位。

这比我正在思考的方式更好吗?

2 个答案:

答案 0 :(得分:2)

我会这样做:链接列表的链接列表

class SparseMatrix {
    ColumnNode head;
    int dimx, dimy;
    // other members
}

class ColumnNode {
    int colNum;
    RowNode head;
    ColumnNode next;
}

class RowNode {
    int rowNum;
    double value;
    RowNode next;
}

具有稍微“瘦”的节点,在类型系统的帮助下更容易正确,并允许您使用head指针跳过不必要的“头”节点。

如果您知道每行(列)至少包含一个值,请切换到列(行)列表数组。

答案 1 :(得分:0)

您可以定义既不包含Nodo字段也不包含value字段的父类nextRowLink。然后,您可以定义两个子类:RowHead,其中nextRowLinkNodoConData具有value字段。第一个用于行头,另一个用于行的其余节点。