为什么要使用稀疏矩阵
(1)稀疏矩阵描述了矩阵的存储结构,能用较少的内存描述矩阵的本质
(2)当矩阵中含0的元素非常多的情况下,才适合用稀疏矩阵
稀疏矩阵的存储结构
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中
Java代码实现
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 ",tmp);
}
System.out.println("");
}
}
}