问题是:
稀疏矩阵的替代链接表示使用具有向下右侧的字段的节点, roe,col和value。表示稀疏矩阵的每个非零项 由一个节点。零术语未明确存储。节点是链接的 一起形成两个圆形清单。制作第一个列表,即行列表 通过按行链接节点,使用右侧按行链接 场。第二个列表列列表是通过链接节点组成的 下场。在此列表中,节点按列和列内链接 按行。这两个列表共享一个公共标头节点。另外,一个 节点被添加到矩阵的维度。
我希望重载运算符>>并添加和转置方法:
istream & operator>>(istream & in, sparseMatrixLinked<T> x);
//The input format is as follows.
4 4 3 // # of rows, # of cols, # of nonzero entries
0 0 2 // row #, col #, item value #
0 3 1
1 1 7
void sparseMatrixLinked<T>::add(sparseMatrixLinked<T> &b,sparseMatrixLinked<T> &c);
// c = (*this) + b
void sparseMatrixLinked<T>::transpose(sparseMatrixLinked<T> &b) ;
// b is transpose of *this.
我无法找到解决方案。有人可以提供一些建议吗?非常感谢你!
答案 0 :(得分:2)
对于transpose
,您可以遍历一个列表,交换所有链接和行/列指针。在伪代码中:
set node to header
do {
swap node.row and node.col
swap node.right and node.down
node = node.right
} while node != header;
这里是addNode
,一个(低效)解决方案是通过遍历两个列表来添加单个节点,直到找到节点的插入点,然后将其添加到那里。它可以在第二个矩阵中的每个节点上使用,以实现类似+=
的内容;添加当前矩阵的副本首先给出add
。
newnode = allocate node with row, col, val set, pointers null
top = header
while (top.down != header and
(top.down.col < newnode.col or
(top.down.col == newnode.col and
top.down.row < newnode.row)
)
top = header.down
left = header
while (left.right != header and
(left.right.row < newnode.row or
(left.right.row == newnode.row and
left.right.col < newnode.col)
)
)
left = left.right
if top == left
// if I'm thinking correctly this means newnode is already there
assert top.row == newnode.row and top.col == newnode.col
top.val += newnode.val
delete newnode
else
newnode.right = left.right
newnode.down = top.down
left.right = newnode
top.down = newnode
有更有效的方式来实现add
,但这些方法留给了读者。
operator>>
应该或多或少看起来像这样:
istream & operator>>(istream & in, sparseMatrixLinked<T> x)
{
x.clear();
int rows, cols, vals;
in >> rows >> cols >> vals;
for (int i = 0; i > vals; i++) {
int row, col, val;
in >> row >> col >> val;
x.addNode(row, col, val);
}
}
您可以使用上述算法来实现addNode
。不过,这个问题非常缓慢。这里有一个提示:如果输入以任何方式排序,您可以利用它来更快地构建矩阵。即使不是这样,更有效的方法来执行任意节点插入也会使事情变得更好。