概述
稀疏数组本质上还是一个二维数组,属于有序数列,只不过其存放数据的位置有其特殊的意义。稀疏数组可以看作是对二维数组一种压缩后的描述,极大的节省了数据存放空间和数据读取时间。
稀疏数组的定义:
- 稀疏数组只有3列
- 稀疏数组第一行记录了源二维数组的规模(多少行&多少列),以及有效数据的数量
- 之后的每一行定义原二维数组有效值的行&列信息,以及实际值
Demo
package com.leolee.dataStructure.sparseArray;
/**
* @ClassName SparseArray
* @Description: 稀疏数组解决棋盘记录问题
* @Author LeoLee
* @Date 2020/9/10
* @Version V1.0
**/
public class SparseArray {
public static void main(String[] args) {
//创建二位数组记录棋盘的原数据,0-没有棋子 1-黑子 2-白子,棋盘大小11*11
int chessboard[][] = new int[11][11];
//任意定义几个棋盘上的棋子位置
chessboard[2][3] = 1;
chessboard[5][7] = 2;
//输出棋盘情况
System.out.println("原始棋盘:");
for (int[] row : chessboard) {
for (int i : row) {
System.out.printf("%d\t", i);
}
System.out.println();
}
System.out.println("------------------二维数组转稀疏数组------------------");
//创建稀疏数组,并将二维数组数据转存到稀疏数组内
int dataSum = 0;//有效数据个数
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard.length; j++) {//由于这里列和行都是11,所以也用chessboard.length来代替
if (chessboard[i][j] != 0) {
dataSum++;
}
}
}
System.out.println("dataSum:" + dataSum);
//创建稀疏数组
int sparseArray[][] = new int[dataSum + 1][3];
//第一行存原始数组数据的大小范围(多少行&多少列)以及有效数据个数
sparseArray[0][0] = 11;
sparseArray[0][1] = 11;
sparseArray[0][2] = dataSum;
//遍历二维数组存放到稀疏数组
int count = 0;//计数器,用于记录第几个有效数据
for (int i = 0; i < chessboard.length; i++) {
for (int j = 0; j < chessboard.length; j++) {//由于这里列和行都是11,所以也用chessboard.length来代替
if (chessboard[i][j] != 0) {
count++;
sparseArray[count][0] = i;//记录原数据在二维数组的行
sparseArray[count][1] = j;//记录元数据在二维数组的列
sparseArray[count][2] = chessboard[i][j];//记录原数据的值
}
}
}
System.out.println("稀疏数组:");
for (int i = 0; i < sparseArray.length; i++) {
for (int j = 0; j < dataSum + 1; j++) {
System.out.printf("%d\t", sparseArray[i][j]);
}
System.out.println();
}
System.out.println("------------------稀疏数组转二维数组------------------");
//初始化二维数组
int chessboard2[][] = new int[sparseArray[0][0]][sparseArray[0][1]];
//赋值
for (int i = 1; i < sparseArray.length; i++) {
chessboard2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
}
//转为二维数组结果:
for (int[] row : chessboard2) {
for (int i : row) {
System.out.printf("%d\t", i);
}
System.out.println();
}
}
}
输出:
原始棋盘:
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 1 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 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
------------------二维数组转稀疏数组------------------
dataSum:2
稀疏数组:
11 11 2
2 3 1
5 7 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 1 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 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