avatar

稀疏数组

为什么要使用稀疏数组

当我们存储有大量重复元素的二维数组时,如果使用一般的二维数组就造成有大量重复元素,很浪费空间
例如这个棋盘,如果要记录棋子的位置我们会想到使用二维数组(1代表黑,2代表蓝),当使用普通二维数组时,那些大量重复的0,占用了很大的内存空间。
于是我们就可以使用稀疏数组来存储有效数据
在这里插入图片描述

稀疏数组怎么用

在这里插入图片描述

稀疏数组一共有三列(列固定),分别表示行号、列、值

  • 第一行:记录初始数组的行、列、有效值个数
  • 其他行:依次记录有效值的行号、列号、值
  • 稀疏数组总行数为有效值(假设有效值为num)num+1,列数为3

思路与实现

数组转稀疏思路

  • 先定义好一个二维数组数组,并赋值
  • 遍历数组,获取有效值个数num
  • 定义稀疏数组,行数为num+1,列数为3,为数组第一行赋值
  • 再次遍历初始数组,获取有效值,赋值给稀疏数组
  • 定义完成

稀疏数组转二维数组

  • 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
  • 再读取稀疏数组后几行的数据,并赋值给 原始的二维数组 即可

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
public static void main(String[] args) {
//创建一个原始的二维数组 11 * 11
//0:表示没有棋子,1 黑子 2 蓝字
int[][] chessArr1 = new int[11][11];
chessArr1[1][2] = 1;
chessArr1[2][3] = 2;
chessArr1[5][4] = 1;
for (int[] row : chessArr1) {
for (int data : row) {
System.out.print(data + "\t");
}
System.out.println();
}
//得到稀疏数组
int[][] sparseArr = toSparseArray(chessArr1);
//输出稀疏数组的形式
System.out.println("-----------");
System.out.println("得到的稀疏数组");
for (int[] ints : sparseArr) {
for (int anInt : ints) {
System.out.print(anInt+"\t ");
}
System.out.println();
}

System.out.println("-------------");
System.out.println("恢复后的二维数组");
//将稀疏数组 恢复成 原始的二维数组
int[][] chessArr2 = recover(sparseArr);
for (int[] ints : chessArr2) {
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
System.out.println();
}
}
/**
* 将二维数组 转 稀疏数组的思路
* 1、先遍历二维数组 得到非0数据的个数
* @param chessArray
* @return
*/
public static int[][] toSparseArray(int[][] chessArray){
//有效数的个数
int sum = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray.length;j++) {
if (chessArray[i][j]!=0) {
sum++;
}
}
}
//2、创建对应的稀疏数组
int sparseArr[][] = new int[sum+1][3];
//给稀疏数组赋值
sparseArr[0][0] = chessArray.length;
sparseArr[0][1] = chessArray.length;
sparseArr[0][2] = sum;
//用于记录是第几个非0数
int count = 0;
for (int i = 0; i < chessArray.length; i++) {
for (int j = 0; j < chessArray.length;j++) {
if (chessArray[i][j]!=0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] =j;
sparseArr[count][2] = chessArray[i][j];
}
}
}
return sparseArr;
}

/**
* 1、先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
* 2、再读取稀疏数组后几行的数据,并赋值给 原始的二维数组 即可
*
* @param sparseArr
* @return
*/
public static int[][] recover(int[][] sparseArr){
int row = sparseArr[0][0];
int col = sparseArr[0][1];
int validNum = sparseArr[0][2];

int chessArr2[][] = new int[row][col];
for (int i = 1;i<sparseArr.length;i++) {
int chessRow = sparseArr[i][0];
int chessCol = sparseArr[i][1];
int chessVal = sparseArr[i][2];
chessArr2[chessRow][chessCol] = chessVal;
}
return chessArr2;
}

总结

理解稀疏数组的使用场景,理解稀疏数组的定义~
韩顺平老师的数据结构 打卡第一天!

文章作者: Hobo
文章链接: https://hobo-clh.github.io/2020/05/07/%E7%A8%80%E7%96%8F%E6%95%B0%E7%BB%84/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hobo's blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论