稀疏矩阵
对一个m×n的矩阵,设s为矩阵元素个数的总和,有s=m*n,设t为矩阵中非零元素个数的总和,满足t<<s的矩阵称作稀疏矩阵。符号“<<”读作小于小于。简单说,稀疏矩阵就是非零元素个数远远小于元素个数的矩阵。相对于稀疏矩阵来说,一个不稀疏的矩阵也称作稠密矩阵。
稀疏矩阵的压缩存储
稀疏矩阵的压缩存储方法,是只存储矩阵中的非零元素。
稀疏矩阵中每个非零元素及其对应的行下标和列下标构成一个三元组,稀疏矩阵中所有这样的三元组构成一个以三元组为数据元素的线性表。
稀疏矩阵的压缩存储结构主要有三元组的数组结构存储和三元组的链表结构存储两大类型。三元组的数组结构存储就是把稀疏矩阵的所有三元组按某种规则存储在一个一维数组中。三元组的链表结构存储就是把稀疏矩阵的所有三元组存储在一个链表中。
数组结构的稀疏矩阵类
三元组的数组结构存储,就是把所有三元组存储在一个数组中。
链式结构稀疏矩阵
稀疏矩阵的所有三元组也可采用链表结构存储。用链表存储的稀疏矩阵三元组简称三元组链表。在三元组链表中每个结点的数据域由稀疏矩阵非零元的行号、列号和元素值组成。
带头结点的三元组链表结构
(a)无序转置;(b)有序转置
行指针数组结构的三元组链表
//三元组类
public class Three {
public int row;
public int col;
public double value;
public Three(int r,int c,double v)
{
this.row = r;
this.col = c;
this.value = v;
}
public Three()
{
this(0,0,0.0);
}
}
public class SpaMatrix {
int rows; //行数
int cols; //列数
int dNum;//非零元素个数
MyVector v;
SpaMatrix(int max)
{
rows = cols = dNum=0;
v = new MyVector(max);
}
//根据用户传来的三元组数组,来初始化矩阵
public void evaluate(int r,int c,int d,Three[] item)throws Exception
{
this.rows = r;
this.cols = c;
this.dNum = d;
for(int i=0;i<d;i++)
{
v.add(i, item[i]);
}
}
//稀疏矩阵的转置
public SpaMatrix transport()throws Exception
{
SpaMatrix a = new SpaMatrix(v.size());
a.rows = this.cols;
a.cols = this.rows;
a.dNum = this.dNum;
for(int i=0;i<dNum;i++)
{
Three t = (Three)v.get(i);
a.v.add(i, new Three(t.col,t.row,t.value));
}
return a;
}
//打印稀疏矩阵的方法
public void print() throws Exception
{
System.out.println("矩阵的行数:"+this.rows);
System.out.println("矩阵的列数:"+this.cols);
System.out.println("非零元素个数:"+this.dNum);
System.out.println("矩阵三元组为:");
for(int i=0;i<dNum;i++)
{
System.out.println("a<"+((Three)v.get(i)).row+","+((Three)v.get(i)).col+">="+((Three)v.get(i)).value);
}
}
}