稀疏矩阵
基本介绍
当一个数组里面有大量重复的的元素时,比如0,可以用稀疏矩阵来保存该数组
图解
转换思路
- 记录数组总共有几行,几列,以及几个不同值
- 把不同值的行,列,以及值,存入一个规模较小的数组,从而缩小规模
代码,Java实现
定义上图中的二维数组
//定义上图中的二维数组
int[][] arry1 = new int[6][7];
arry1[0][3] = 22;
arry1[0][6] = 15;
arry1[1][1] = 11;
arry1[1][6] = 17;
arry1[2][3] = -6;
arry1[3][6] = 39;
arry1[4][0] = 91;
arry1[5][2] = 28;
数组转换成稀疏数组
public static int[][] array2sparese(int[][] arry){
int count = 0;
//先遍历一遍数组,确定稀疏数组的长度
for(int[] row : arry){
for(int data : row){
if(data != 0){
count++;
}
}
}
//初始化稀疏数组
int[][] sparese = new int[count+1][3];
//存入原始数组row,col,有效个数
sparese[0][0] = arry.length;
sparese[0][1] = arry[0].length;
sparese[0][2] = count;
//遍历原始数组,存入有效数字
int sum = 0;
for(int i = 0; i < arry.length; i ++){
for(int j = 0; j < arry[i].length; j++){
if(arry[i][j] != 0){
sum++;
sparese[sum][0] = i;
sparese[sum][1] = j;
sparese[sum][2] = arry[i][j];
}
}
}
return sparese;
}
稀疏数组转换成数组
//稀疏数组转换成普通数组
public static int[][] sparese2array(int[][] sparese){
//读取信息,创建数组
int[][] arry = new int[sparese[0][0]][sparese[0][1]];
//遍历稀疏数组,然后赋值
for(int i = 1; i < sparese.length; i++){
arry[sparese[i][0]][sparese[i][1]] = sparese[i][2];
}
return arry;
}
测试,运行
//输出原始数组看看
System.out.println("=======原始数组=======");
for(int[] row : arry1){
for(int data : row){
System.out.print(data + " ");
}
System.out.println();
}
//转换成稀疏数组
int[][] sparese = array2sparese(arry1);
//输出看看
System.out.println("=======稀疏数组=======");
for(int[] row : sparese){
for(int data : row){
System.out.print(data + " ");
}
System.out.println();
}
//转回来
int[][] arry2 = sparese2array(sparese);
//输出看看
System.out.println("=======稀疏数组变回原始数组=======");
for(int[] row : arry2){
for(int data : row){
System.out.print(data + " ");
}
System.out.println();
}