(1)稀疏矩陣描述了矩陣的存儲結構,能用較少的內存描述矩陣的本質
(2)當矩陣中含0的元素很是多的狀況下,才適合用稀疏矩陣java
1 | 2 | 3 | |
---|---|---|---|
0 | rowCount | colCount | valueCount(!=0) |
1 | rowIndex | colIndex | value |
2 | rowIndex | colIndex | value |
Step1 遍歷矩陣,記錄非零元素的個數count
Step2 根據count建立稀疏矩陣sparseArray=new int[cout+1][3];
Step3 將矩陣中的元素逐一存入到saprseArray中數組
public class SparseArray { public static void main(String[] args) { //定義測試數組 int[][] demoArry={ {0,0,0,1}, {2,0,0,0}, {0,0,0,3}, {0,0,0,4}, {0,0,0,4} }; int[][] sparseArray=ConvertToSparse(demoArry); printArry(sparseArray); printArry(ConvertToArry(sparseArray)); } /** * 原始數組轉化爲稀疏矩陣 * @param array * @return */ private static int[][] ConvertToSparse(int[][] array) { if(array.length==0){ return null; } //遍歷二維數組(有兩種方式),獲取總的非0個數count int count = 0; int row=0; int col=0; for (int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ if(array[i][j]!=0){ count ++; } col=i;//二維數組的col } row++;//二維數組的row; } //建立稀疏矩陣,並初始化表頭 int[][] sparseArray=new int[count+1][3]; //初始化稀疏矩陣的表頭,記錄原始矩陣的rows、col和不相同的非0元素的個數 sparseArray[0][0]=row; sparseArray[0][1]=col; sparseArray[0][2]=count; //原始矩陣映射到稀疏矩陣 int sum=0;//記錄第幾個非0元素 for(int i=0;i<array.length;i++){ for(int j=0;j<array[i].length;j++){ if(array[i][j]!=0){ sum++; sparseArray[sum][0]=i;//row sparseArray[sum][1]=j;//col sparseArray[sum][2]=array[i][j];//value } } } return sparseArray; } /** * 轉化爲原始矩陣 * @param sparseArray * @return */ private static int[][] ConvertToArry(int[][] sparseArray){ if(sparseArray.length==0){ return null; } //根據表頭信息建立原始數組 int[][] array=new int[sparseArray[0][0]][sparseArray[0][1]]; for(int i=1;i<sparseArray.length;i++){ array[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2]; } return array; } /** * 打印數組內容 * @param array */ private static void printArry(int[][] array){ for(int[] tmpArray:array){ for(int tmp:tmpArray){ System.out.printf("%d\t",tmp); } System.out.println(""); } } }