数据结构之稀疏数组篇
比较基本的定义是当二维数组中的大多数元素为零,将其转换为稀疏数组,在进行操作时可以极大的降低内存的消耗和节约时间
-
二维数组转换为稀疏数组如下图所示:

-
代码和结果如下所示
//新建一个二维数组 int tdArray[][]=new int[6][10]; tdArray[1][1]=1; tdArray[2][2]=2; tdArray[3][3]=3; tdArray[2][5]=4; System.out.println("-----------二维数组---------------"); for (int[] row : tdArray) { for (int data:row){ System.out.print(data+" "); } System.out.println(); }
此时的输出结果1为:
-----------二维数组---------------0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 4 0 0 0 0
0 0 0 3 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
二维数组转换为稀疏数组的代码如下: /*二维数组转换为稀疏数组*/
public static int[][]Td2Sparse(int[][]tdArray){
//sum值为二维数组中的值不为0的个数
int sum=0;
for (int i = 0; i <tdArray.length; i++) {
for (int j=0;j<tdArray[i].length;j++){
if(tdArray[i][j]!=0){
sum++;
}
}
}
//稀疏数组第0行为二维数组的总行数,总列数和二维数组中不为0的个数
int [][]sparseArray=new int[sum+1][3];
sparseArray[0][0]=tdArray.length;
sparseArray[0][1]=tdArray[0].length;
sparseArray[0][2]=sum;
int num=0;
num从第一行开始,记录每一个元素的行列值
for (int i = 0; i <tdArray.length; i++) {
for (int j=0;j<tdArray[i].length;j++){
if(tdArray[i][j]!=0){
num++;
sparseArray[num][0]=i;
sparseArray[num][1]=j;
sparseArray[num][2]=tdArray[i][j];
}
}
}
return sparseArray;
}
System.out.println("-----------二维数组转换为稀疏数组---------------");
int[][] sparseArray = Td2Sparse(tdArray);
for (int[] row : sparseArray) {
for (int data:row){
System.out.print(data+" ");
}
System.out.println();
}
此时的输出结果2为:
-----------二维数组转换为稀疏数组---------------6 10 4
1 1 1
2 2 2
2 5 4
3 3 3
稀疏数组转换为二维数组的代码如下: /*稀疏矩阵转换为二维数组*/
public static int[][]Sparse2Td(int[][]sparseArray){
//读取稀疏数组的(0,0)和(0,1)作为二维数组的行和列
int[][]tdarray=new int[sparseArray[0][0]][sparseArray[0][1]];
//将稀疏数组的每一行(行,列,值)读入二维数组
for (int i=1;i<sparseArray.length;i++){
tdarray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
return tdarray;
}
System.out.println("-----------稀疏数组转换为二维数组---------------");
int[][] tdArray2 = Sparse2Td(sparseArray);
for (int[] row : tdArray2) {
for (int data:row){
System.out.print(data+" ");
}
System.out.println();
}
此时输出结果3为:
-----------稀疏数组转换为二维数组---------------0 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 2 0 0 4 0 0 0 0
0 0 0 3 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
输出结果3和1的结果一致。
最后为全文的所有代码:
package com.xu.sparseArray;
/*稀疏数组
* 1.二维数组转换为稀疏矩阵
* 2.稀疏数组转换为二维数组
* */
public class SparseArray {
public static void main(String[] args) {
//新建一个二维数组
int tdArray[][]=new int[6][10];
tdArray[1][1]=1;
tdArray[2][2]=2;
tdArray[3][3]=3;
tdArray[2][5]=4;
System.out.println("-----------二维数组---------------");
for (int[] row : tdArray) {
for (int data:row){
System.out.print(data+" ");
}
System.out.println();
}
System.out.println("-----------二维数组转换为稀疏数组---------------");
int[][] sparseArray = Td2Sparse(tdArray);
for (int[] row : sparseArray) {
for (int data:row){
System.out.print(data+" ");
}
System.out.println();
}
System.out.println("-----------稀疏数组转换为二维数组---------------");
int[][] tdArray2 = Sparse2Td(sparseArray);
for (int[] row : tdArray2) {
for (int data:row){
System.out.print(data+" ");
}
System.out.println();
}
}
/*矩阵转换为稀疏矩阵*/
public static int[][]Td2Sparse(int[][]tdArray){
int sum=0;
for (int i = 0; i <tdArray.length; i++) {
for (int j=0;j<tdArray[i].length;j++){
if(tdArray[i][j]!=0){
sum++;
}
}
}
int [][]sparseArray=new int[sum+1][3];
sparseArray[0][0]=tdArray.length;
sparseArray[0][1]=tdArray[0].length;
sparseArray[0][2]=sum;
int num=0;
for (int i = 0; i <tdArray.length; i++) {
for (int j=0;j<tdArray[i].length;j++){
if(tdArray[i][j]!=0){
num++;
sparseArray[num][0]=i;
sparseArray[num][1]=j;
sparseArray[num][2]=tdArray[i][j];
}
}
}
return sparseArray;
}
/*稀疏矩阵转换为二维数组*/
public static int[][]Sparse2Td(int[][]sparseArray){
int[][]tdarray=new int[sparseArray[0][0]][sparseArray[0][1]];
for (int i=1;i<sparseArray.length;i++){
tdarray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
}
return tdarray;
}
}