1、稀疏数组定义
稀疏数组(sparse array)是一种只为数组中的非零元素分配内存的特殊类型数组,内存中存储了数组中非零元素的下标和值。
2、稀疏数组与二维数组
-
普通二维数组
-
二维数组转稀疏数组后
-
稀疏数组图解
将二维数组转称稀疏数组之后,在稀疏数组中存储的是二维数组中所有非0(不一定是非0,在实际应用中,可能是数组中大量存在的并且分布没有规律的元素)元素的下标和值。稀疏数组的列数是固定的,只有3列:
- 第一列存放的是二维数组中有效元素的行坐标;
- 第二列存放的是二维数组中有效元素的列坐标;
- 第三列存放的是二维数组中有效元素的值;
稀疏数组的行数根据有效元素的个数来确定,一般为有效元素的个数+1,因为在稀疏数组中第一行(下标为0)依次存放的是二维数组的总行数、总列数、有效元素个数。所以真正存放二维数组中有效元素的是从第2行开始的(下标为1).
3、代码实现(Java)
package com.lee.sparsearray;
public class SparseArray {
public static void main(String[] args) {
//新建二维数组并给其中部分赋值
int[][] arr1 = new int[11][11];
arr1 [1][2] = 1;
arr1 [2][3] = 2;
arr1 [3][4] = 2;
arr1 [6][7] = 1;
//输出原始二维数组
System.out.println("原始二维数组");
for(int[] row : arr1 ){
for(int data : row){
System.out.print(data + " ");
}
System.out.println();
}
//遍历二维数组查看有多少个有效元素
int sum = 0;
for(int[] row : arr1 ){
for(int data : row){
if(data != 0){
sum++;
}
}
}
//创建稀疏数组,并存放稀疏数组第一行的值
int[][] sparseArr = new int[sum + 1][3];
sparseArr[0][0] = arr1 .length;
sparseArr[0][1] = arr1 [0].length;
sparseArr[0][2] = sum;
//遍历二维数组,将有效元素存放到稀疏数组中
int count = 0;
for(int i = 0; i < arr1 .length; i++){
for(int j = 0; j < arr1 [i].length; j++){
if(arr1 [i][j] != 0){
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arr1 [i][j];
}
}
}
//输出稀疏数组
System.out.println("稀疏数组");
for(int i = 0; i < sparseArr.length; i++){
for(int j = 0; j < 3; j++){
System.out.print(sparseArr[i][j] + " ");
}
System.out.println();
}
//从稀疏数组恢复到二维数组
int[][] arr2 = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1; i < sparseArr.length; i++){
arr2 [sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
//打印恢复后的二维数组
System.out.println("恢复后的二维数组");
for(int[] row : arr2 ){
for(int data : row){
System.out.print(data + " ");
}
System.out.println();
}
}
}