目录
1.稀疏数组
2.稀疏数组的使用
2.1 二维数组转换为稀疏数组
2.2 稀疏数组转换为二维数组
1.稀疏数组
稀疏数组(Sparse Array):当一个数组中的大部分元素为相同的值,可使用稀疏数组来保存该数组,可以将稀疏数组看做是普通数组的压缩
例如
数组arr中许多值为0,若对二维数组直接进行存储,则会存储许多相同的数值0,造成空间的浪费,此时,我们可以用稀疏数组对其进行存储
2.稀疏数组的使用
要对二维数组进行存储,我们需要知道二维数组的行和列、不同数值的数量以及不同元素的位置和值
稀疏数组的第一行,存放二维数组arr的行数、列数、不同数值的数量sum
后面几行,存放不同值元素在二维数组arr中的行、列、数值
代码实现
创建二维数组
int[][] arr = new int[6][5];
arr[1][0] = 1;
arr[1][3] = 6;
arr[4][3] = 2;
2.1 二维数组转换为稀疏数组
(1)遍历二维数组,确定不同元素的个数sum
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if(arr[i][j] != 0){
sum++;
}
}
}
(2)根据sum创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
(3) 遍历二维数组,对稀疏数组进行赋值
//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;
//再对不同元素进行存储
int k = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if(arr[i][j] != 0){
k++;
//分别存放不同元素的行、列以及数值
sparseArr[k][0] = i;
sparseArr[k][1] = j;
sparseArr[k][2] = arr[i][j];
}
}
}
2.2 稀疏数组转换为二维数组
(1)创建二维数组
int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
(2)遍历稀疏数组, 对不同值元素进行赋值
//遍历稀疏数组,对不同值元素进行赋值
for (int i = 1; i < sparseArr.length; i++) {
arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
完整代码
public class Test {
public static void main(String[] args) {
//创建二维数组
int[][] arr = new int[6][5];
arr[1][0] = 1;
arr[1][3] = 6;
arr[4][3] = 2;
System.out.println("****二维数组****");
for (int[] row: arr) {
for (int data: row) {
System.out.printf("%d ",data);
}
System.out.println();
}
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if(arr[i][j] != 0){
sum++;
}
}
}
//创建稀疏数组
int[][] sparseArr = new int[sum+1][3];
//稀疏数组的第一行分别存放二维数组的行数、列数以及不同元素的个数
sparseArr[0][0] = arr.length;
sparseArr[0][1] = arr[0].length;
sparseArr[0][2] = sum;
//再对不同元素进行存储
int k = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[0].length; j++) {
if(arr[i][j] != 0){
k++;
//分别存放不同元素的行、列以及数值
sparseArr[k][0] = i;
sparseArr[k][1] = j;
sparseArr[k][2] = arr[i][j];
}
}
}
System.out.println("****稀疏数组****");
for (int[] row: sparseArr) {
for (int data: row) {
System.out.printf("%d ",data);
}
System.out.println();
}
//创建二维数组
int[][] arr1 = new int[sparseArr[0][0]][sparseArr[0][1]];
//遍历稀疏数组,对不同值元素进行赋值
for (int i = 1; i < sparseArr.length; i++) {
arr1[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
}
System.out.println("****二维数组****");
for (int[] row: arr1) {
for (int data: row) {
System.out.printf("%d ",data);
}
System.out.println();
}
}
}
运行结果