1. 程式人生 > 其它 >Java資料結構之稀疏陣列

Java資料結構之稀疏陣列

技術標籤:資料結構java

Java資料結構之稀疏陣列

什麼是稀疏陣列

稀疏陣列可以用來儲存大部分元素為0或者為同一個值的陣列。

原理

1、記錄二維陣列一共有幾行幾列,有多少個值
2、將各個值的行位置、列位置和資料記錄在一個小規模的陣列中(這個陣列就是稀疏陣列),從而縮小程式規模。

二維陣列

0 0 1 0 0 0 
0 0 0 2 0 0 
0 0 0 0 3 0 
0 0 0 0 0 4 
0 0 0 0 0 0 
0 0 0 0 0 0 

稀疏陣列

6 6 4
0 2 1
1 3 2
2 4 3
3 5 4

稀疏陣列第一行各列分別是二維陣列的行數、列數和非0的值個數;剩下的每行的各列分別代表二維陣列中非0值的行位置、列位置和值。

稀疏陣列和二維陣列的轉換

以以下二維陣列為例
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

二維陣列轉稀疏陣列

1)遍歷原始二維陣列,得到有效資料的個數sum
2)根據有效資料的個數建立稀疏陣列
int[sum+1][3] sparseArray
3)將二維陣列的有效資料儲存進稀疏陣列

程式碼實現

public static int[][] TDAtoSPA(int[][] tda) {
		int row_length=tda.length;//行數
		int col_length=tda[0].length;//列數
		int val_num=0;//非0的個數
		
		List list=new ArrayList();
		for(int i=0;i<row_length;i++) {//儲存二維陣列中非0資料的位置和資料
			for(int j=0;j<col_length;j++) {
				if(tda[i][j]!=0) {
					val_num+=1;
					int datas[]=new int[3];
					datas[0]=i;//行位置
					datas[1]=j;//列位置
					datas[2]=tda[i][j];//資料
					list.add(datas);//放入到list中
				}
			}
		}
		int [][]spa=new int[val_num+1][3];//給第一行賦值,分別是行、列、值
		spa[0][0]=row_length;
		spa[0][1]=col_length;
		spa[0][2]=val_num+1;
		
		for(int i=1;i<=list.size();i++) {//給剩下的行賦值
			int [] a=(int[]) list.get(i-1);
			spa[i][0]=a[0];
			spa[i][1]=a[1];
			spa[i][2]=a[2];
		}
		System.out.println("稀疏陣列");
		for(int []row:spa) {//列印稀疏陣列
			for(int data:row) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		return spa;
		
	}
public static void main(String[] args) throws IOException {
	
		int [][] a=new int[6][6];
		a[1][2]=1;
		a[2][4]=2;
		for(int [] i:a) {
			for(int data:i) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		SparseArrayDemo.TDAtoSPA(a);
	}

結果
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0

0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列
6 6 3
1 2 1
2 4 2

稀疏陣列轉二維陣列

1)首先讀取稀疏陣列的第一行,根據第一行的前兩列建立原始的二維陣列,即全0的二維陣列
2)讀取稀疏陣列後幾行的資料,並賦給原始二維陣列。

程式碼實現

public static int[][] SPAtoTDA(int[][] spa) {
		int[][] tda=new int[spa[0][0]][spa[0][1]];//建立原始二維陣列
		
		for(int i=1;i<spa.length;i++) {//賦值
			
				tda[spa[i][0]][spa[i][1]]=spa[i][2];
			
		}
		System.out.println("還原二維陣列");
		for(int [] i:tda) {//列印二維陣列
			for(int data:i) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		return tda;
	}
public static void main(String[] args) throws IOException {
	
		int [][] a=new int[6][6];
		a[1][2]=1;
		a[2][4]=2;
		for(int [] i:a) {
			for(int data:i) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		SparseArrayDemo.SPAtoTDA(SparseArrayDemo.TDAtoSPA(a));
	}
	

結果
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
稀疏陣列
6 6 3
1 2 1
2 4 2
還原二維陣列
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 2 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

稀疏陣列儲存到硬碟

public static void Save(String filename,int[][]spa) throws IOException{
		File file=new File(filename);//通過引數命名得到要儲存的檔名
		FileWriter fileWriter=null;
		
		if(!file.exists()) {
			file.createNewFile();//檔案不存在就建立
		}
		
		 fileWriter=new FileWriter(file);
		for(int[] row:spa) {
			for(int data:row) {
				fileWriter.write(data);//將資料寫入到檔案中
			}
		}
		fileWriter.flush();//關閉快取
		fileWriter.close();//關閉流
	}
public static void main(String[] args) throws IOException {
	
		int [][] a=new int[6][6];
		a[1][2]=1;
		a[2][4]=2;
		for(int [] i:a) {
			for(int data:i) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
		SparseArrayDemo.Save("spa.txt",SparseArrayDemo.TDAtoSPA(a));
	}

結果
檔案被儲存到專案目錄下
在這裡插入圖片描述

從硬碟取出稀疏陣列

public static int[][] Load(String filename) throws IOException{
		FileReader fileReader=new FileReader(filename);
		Map<Integer, Integer> map=new HashMap();
		int data=0;int count=0;
		while((data=fileReader.read())!=-1) {//將檔案中的資料存入到Map中
			map.put(count, data);
			count++;
		}
		
		if(map.size()==0)return null;
		int[][]spa=new int[map.size()/3][3];//建立稀疏陣列
		int index=0;
		for(int i=0;i<map.size()/3;i++) {//將Map中的資料存入到稀疏陣列
			for(int j=0;j<map.size()/3;j++) {
				spa[i][j]=map.get(index);
				index++;
			}
		}
		map.clear();
		return spa;
	}
	public static void main(String[] args) throws IOException {
	
//		int [][] a=new int[6][6];
//		a[1][2]=1;
//		a[2][4]=2;
//		for(int [] i:a) {
//			for(int data:i) {
//				System.out.printf("%d\t",data);
//			}
//			System.out.println();
//		}
		System.out.println("稀疏陣列");
		int spa[][]=SparseArrayDemo.Load("spa.txt");
		for(int [] i:spa) {
			for(int data:i) {
				System.out.printf("%d\t",data);
			}
			System.out.println();
		}
	}

結果
稀疏陣列
6 6 3
1 2 1
2 4 2