Java基础——稀疏矩阵(数组)的意义与转变方法
定义
在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非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 2 0 0 0
0 0 0 0 0 5 0
由于数组中有效数字(非0)与无效数组比例较小,存储空间利用率低,因此使用稀疏数组(矩阵)能提高空间利用率
上述数组转换成的稀疏数组(矩阵)
行(x) | 列(y) | 值(z) |
---|---|---|
5 | 7 | 4 |
1 | 2 | 1 |
2 | 3 | 2 |
3 | 3 | 2 |
4 | 5 | 5 |
解释:
第一行的“5”,“7”,“4” 为原二维数组行为5,列为7,有效数字个数为4个
第二行开始的各行都表示在原数组中X行 Y列的值为Z
如第二行的’1’,‘2’,'1’表示为在二维数组的第1行第2列中存放了一个”1“;
代码实现
主函数各个数组初始化及调用过程
public static void main(String[] args) {
int Rows = 10,Columns = 11,count = 0 ;//基本量 Rows行数,Columns列数,count有效数个数
int[][] arrays1 = new int[Rows][Columns];//初始化二维数组
arrays1[1][2] = 1;
arrays1[2][3] = 2;
arrays1[6][9] = 4;
arrays1[8][4] = 1;
System.out.println("\n打印正常数组");
for (int i = 0; i < arrays1.length; i++) {
for (int j = 0; j < arrays1[i].length; j++) {
System.out.print(arrays1[i][j]+" ");
if (arrays1[i][j]!=0) {
count++;
}
}
System.out.println();
}
//将数组转换为稀疏数组
System.out.println("\n___________");
int[][] sparseArray = SparseArray(arrays1, Rows, Columns, count);
System.out.println("打印稀疏数组");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < sparseArray[i].length; j++) {
System.out.print(sparseArray[i][j]+"\t");
}
System.out.println();
}
//将稀疏数组转换回正常数组
System.out.println("\n===========");
int[][] resparseArray = ReSparseArray(sparseArray);
System.out.println("打印转换回正常的数组");
for (int i = 0; i < resparseArray.length; i++) {
for (int j = 0; j < resparseArray[i].length; j++) {
System.out.print(resparseArray[i][j]+" ");
}
System.out.println();
}
}
转换稀疏数组的静态方法
//生成稀疏数组 返回一个int型二维数组
/*
* Array为接收的数组
* Row为该数组的行数
* Column为该数组的列数
*/
public static int[][] SparseArray(int[][] Array,int Row,int Column,int Count) {
//初始化稀疏数组
int[][] sparseArray = new int[Count+1][3];
sparseArray[0][0] = Row;
sparseArray[0][1] = Column;
sparseArray[0][2] = Count;
int count = 0;
for (int i = 0; i < Array.length; i++) {
for (int j = 0; j < Array[i].length; j++) {
if (Array[i][j]!=0) {
count++;
sparseArray[count][0] = i;
sparseArray[count][1] = j;
sparseArray[count][2] = Array[i][j];
}
}
}
return sparseArray;
}
将稀疏数组转换为正常数组的方法
/*
* 将稀疏数组转换为正常数组
*/
public static int[][] ReSparseArray(int[][] SprseArray) {
//将稀疏数组第一行的值作为基本信息,初始化一个正常的二维数组
int[][] resparseArray = new int[SprseArray[0][0]][SprseArray[0][1]];
for (int i = 1; i < SprseArray.length; i++) {
resparseArray[SprseArray[i][0]][SprseArray[i][1]] = SprseArray[i][2];
}
return resparseArray;
}
注意
- 为了使用方便,在此处所有的方法均设置成静态方法
最终结果
打印正常数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
___________
打印稀疏数组
10 11 4
1 2 1
2 3 2
6 9 4
8 4 1
===========
打印转换回正常的数组
0 0 0 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 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 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 4 0
0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0