(十五)稀疏矩陣和三元組稀疏矩陣壓縮算法

稀疏矩陣

對一個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);	
    	}
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章