用链表表示Java中的稀疏矩阵
我正在制作一个小程序来表示稀疏矩阵(一个有很多元素等于零的矩阵)。如第108页所示(我认为看这个图就足以理解它),它使用的是链表 [如果你理解这个数字,就不要读这一段]用链表表示Java中的稀疏矩阵,java,sparse-matrix,Java,Sparse Matrix,我正在制作一个小程序来表示稀疏矩阵(一个有很多元素等于零的矩阵)。如第108页所示(我认为看这个图就足以理解它),它使用的是链表 [如果你理解这个数字,就不要读这一段] 它必须只存储与零不同的元素,保存元素的行和列,并按如下方式链接它们。矩阵的第一个元素必须有它的维数;它链接到一个节点,该节点表示元素不同于零的第一行,该元素链接到两个节点:矩阵元素本身(右侧链接)和元素不同于零的下一行。这样,就构成了整个矩阵 好的,我在思考每个类的变量时遇到了问题。我有两个:节点和矩阵 public class
它必须只存储与零不同的元素,保存元素的行和列,并按如下方式链接它们。矩阵的第一个元素必须有它的维数;它链接到一个节点,该节点表示元素不同于零的第一行,该元素链接到两个节点:矩阵元素本身(右侧链接)和元素不同于零的下一行。这样,就构成了整个矩阵 好的,我在思考每个类的变量时遇到了问题。我有两个:
节点
和矩阵
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
中存储任何内容。我问的是内存使用,因为space矩阵的目的是不使用内存中不必要的空间。什么意味着nextRowLink=null
?,value
是本机变量,因此,即使它是value=0或Double.NaN,也需要64位代码>
这是一种比我正在考虑的更好的方法吗?我会这样做:一个链表的链表
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
指针跳过不必要的“head”节点
如果您知道每行(列)至少包含一个值,请切换到列(行)列表数组。您可以定义既不包含值字段也不包含下一个链接字段的父类Nodo
。然后可以定义两个子类:RowHead
具有nextRowLink
和nodoconda
具有值
字段。第一个用于行标题,另一个用于行上的其余节点。最后一个行节点必须链接到ColumnNode,因为它们是不同的类,所以有问题,不是吗?看这个图()@Roger:如果你愿意,你可以让这两种类型的列表循环,就像图中一样:将最后一个RowNode
的next
指向其列中的第一个RowNode
。不过,这需要空节点来支持空行/空列。(我看不出什么算法会从这个设置中受益…)最后一个节点数据必须链接到一个RowHead,它们有相同的父类,但是,没有问题吗?后面的问题呢?nextRowLink=null的内存用途是什么代码>和带有双对象的一个。