转载自CSDN博主「飒飒蝴蝶谷」的原创文章
原文链接:https://blog.csdn.net/qq_42435377/article/details/107425298
稀疏数组
概述
当一个数组中重复元素居多的时候,可以使用稀疏数组保存。
比如:五子棋,白子为1、黑子为2、无子为0,大多数数据都是0,则可以使用稀疏数组进行保存。
原理
将二维数组中的有效数据转换为稀疏数组保存
稀疏数组记录的数据有:
编号 | 行 | 列 | 值 |
---|---|---|---|
0 | 共有几行 | 共有几列 | 共几个有效值 |
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 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
# 共11行,11列
以上二维数组保存为稀疏数组:
11 11 2 # 共十一行十一列两个有效值
1 2 1 # 第1行第2列值为1 从0列开始
2 3 2 # 第2行第3列值为2
实现
public class SparseArray {
public static void main(String[] args) {
//创建初二维数组
int array[][] = new int[11][11] ;
//赋值
array[1][2] = 1;
array[2][3] = 2;
array[3][4] = 3;
//遍历输出
for (int[] ints : array) {
for (int anInt : ints) {
System.out.print(anInt);
}
System.out.println();
}
System.out.println("========转换成稀疏数组=======");
//转换成稀疏数组
int sum = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
if (array[i][j] != 0) {
sum++;//记录有多少个有效数据
}
}
}
System.out.println("sum=" + sum);
//创建稀疏数组
int sparseArray[][] = new int[sum+1][3];
//给稀疏数组第一行赋值
sparseArray[0][0] = array.length;
sparseArray[0][1] = array[0].length;
sparseArray[0][2] = sum;
//给稀疏数组其他行赋值
int count = 0;//count记录这是第几个有效数据
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];
}
}
}
for (int[] ints : sparseArray) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
System.out.println("=======转换成普通二维数组======");
//转换成普通二维数组
//创建数组
int array2[][] = new int[ sparseArray[0][0] ] [ sparseArray[0][1] ] ;
//将有效数据赋值给普通二维数组
for (int i = 1; i < sparseArray[0][2] + 1; i++) {
array2[ sparseArray[i][0] ][ sparseArray[i][1] ] = sparseArray[i][2];
}
//遍历输出
for (int[] ints : array2) {
for (int anInt : ints) {
System.out.print(anInt);
}
System.out.println();
}
}
}
执行结果:
00000000000
00100000000
00020000000
00003000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
========转换成稀疏数组=======
11 11 3
1 2 1
2 3 2
3 4 3
=======转换成普通二维数组======
00000000000
00100000000
00020000000
00003000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000
00000000000