(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(""); } } }