我正在制作一个小程序来表示稀疏矩阵(一个矩阵,其中许多元素等于零)。代表像this第108页(我想在图中观看就足以理解它)它正在使用链接列表。
[如果您理解图中],请不要阅读本段 它必须只存储不同的零元素,保存元素的行和列,并按如下方式链接它们。矩阵的第一个元素必须具有它的维度;它链接到一个节点,该节点表示元素不为零的第一行,并且该元素链接到两个节点:矩阵本身的元素(右边的链接)和下一行的元素不同为零。这样就构建了整个矩阵。
好的,我在思考每个班级的变量时遇到了问题。我有两个:Node
和Matrix
。
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位。
这比我正在思考的方式更好吗?
答案 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
,其中nextRowLink
和NodoConData
具有value
字段。第一个用于行头,另一个用于行的其余节点。