1. 程式人生 > >資料結構與演算法(Java描述)-15、稀疏矩陣以及稀疏矩陣的三元組實現

資料結構與演算法(Java描述)-15、稀疏矩陣以及稀疏矩陣的三元組實現

一、稀疏矩陣

對一個m×n的矩陣,設s為矩陣元素個數的總和,有s=m*n,設t為矩陣中非零元素個數的總和,滿足t<<s的矩陣稱作稀疏矩陣。符號“<<”讀作小於小於。簡單說,稀疏矩陣就是非零元素個數遠遠小於元素個數的矩陣。相對於稀疏矩陣來說,一個不稀疏的矩陣也稱作稠密矩陣。 

二、稀疏矩陣的壓縮儲存

稀疏矩陣的壓縮儲存方法,是隻儲存矩陣中的非零元素。
稀疏矩陣中每個非零元素及其對應的行下標和列下標構成一個三元組,稀疏矩陣中所有這樣的三元組構成一個以三元組為資料元素的線性表。 


稀疏矩陣和對應的三元組線性表

稀疏矩陣的壓縮儲存結構主要有三元組的陣列結構儲存和三元組的連結串列結構儲存兩大型別。三元組的陣列結構儲存就是把稀疏矩陣的所有三元組按某種規則儲存在一個一維陣列中。三元組的連結串列結構儲存就是把稀疏矩陣的所有三元組儲存在一個連結串列中

陣列結構的稀疏矩陣類 :

三元組的陣列結構儲存,就是把所有三元組儲存在一個數組中。


鏈式結構稀疏矩陣:

稀疏矩陣的所有三元組也可採用連結串列結構儲存。用連結串列儲存的稀疏矩陣三元組簡稱三元組連結串列。在三元組連結串列中每個結點的資料域由稀疏矩陣非零元的行號、列號和元素值組成。


帶頭節點的三元連結串列結構

三、三元組稀疏矩陣壓縮演算法的實現

//三元組類
public class Three {

	//行數
	public int row;
	//列數
	public int col;
	//值
	public double value;
	
	public Three(int row,int col,double value) {
		this.row=row;
		this.col=col;
		this.value=value;
	}
	public Three() {
		this(0,0, 0);
	}
	
}
import java.util.ArrayList;
import java.util.List;

//稀疏矩陣的壓縮演算法
public class SpanMartrix {

	//行數
	public int rows;
	//列數
	public int cols;
	//非零元素個數
	public int dNum;
	
	List<Three> list;
	
	public SpanMartrix(int max) {
		rows=cols=dNum=0;
		list=new ArrayList<>(max);
	}
	
	//根據使用者傳來的三元組類陣列來初始化稀疏矩陣
	public void evaluate(int rows,int cols,int dNum,Three three[]) {
		this.rows=rows;
		this.cols=cols;
		this.dNum=dNum;
		for (int i = 0; i < dNum; i++) {
			list.add(i,three[i]);
		}
	}
	
	//列印稀疏矩陣
	public void printSpanMartrix() {
		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("martrix<"+list.get(i).row+","+list.get(i).col+">="+list.get(i).value);
		}
	}
	
	//矩陣的轉置
	public SpanMartrix transport() {
		SpanMartrix newMartrix=new SpanMartrix(list.size());
		newMartrix.rows=this.cols;
		newMartrix.cols=this.rows;
		newMartrix.dNum=this.dNum;
		for(int i=0;i<dNum;i++) {
			Three three=list.get(i);
			newMartrix.list.add(new Three(three.col,three.row,three.value));
		}
		
		return newMartrix;
	}
	
}
測試:
public class SpanMain {

	public static void main(String[] args) {
		SpanMartrix mar1=new SpanMartrix(10);
		SpanMartrix mar2;
		Three three[]= new Three[6];
		three[0]= new Three(1,3,11.0);
		three[1]= new Three(1,5,17.0);
		three[2]= new Three(2,2,25.0);
		three[3]= new Three(4,1,19.0);
		three[4]= new Three(5,4,37.0);
		three[5]= new Three(6,7,50.0);
		
		mar1.evaluate(6, 7, 6, three);
		System.out.println("原矩陣..............");
		mar1.printSpanMartrix();
		System.out.println("轉置之後的矩陣.........");
		mar2=mar1.transport();
		mar2.printSpanMartrix();
	}
}