一、为什么用稀疏数组?
比如这个棋盘,如果要记录黑蓝棋子的位置首先会想到运用二维数组,我们把二维数组建好后(1是黑,2是蓝),发现很多空白位置浪费了大量的内存空间
我们这个时候可以用稀疏数组来存储“有效数据”
二、怎么使用稀疏数组
稀疏数组一共有三列(列固定),分别表示行号,列号和值
第一行:记录初始数组的行、列、有效值(有意义的值)
其他行:逐次记录有效值的行号、列号和值
由图可知,稀疏数组总行数为有效值(假设有效值为num)num+1,列数为3
三、代码实现
数组转稀疏思路:
- 先定义好一个数组,并赋值
- 遍历数组,获取有效值个数num
- 定义稀疏数组,行数为num+1,列数为3,为数组第一行赋值
- 再次遍历初始数组,获取有效值,赋值给稀疏数组
- 定义完成
稀疏数组转二维数组:
- 定义二维数组,行和列从稀疏数组第一行读取
- 设置循环,根据稀疏数组后几行来恢复
代码:
1 int[][] array1=new int[11][11];
2 //为数组赋值,1是黑色,2是蓝色
3 array1[1][2]=1;
4 array1[2][3]=2;
5 //遍历数组
6 for (int[] row:array1) {
7 for (int item:row) {
8 System.out.print(item+"\t");
9 }
10 System.out.println();
11 }
12 int num=0;
13 //再次遍历数组,找出实际存在的数有几个
14 for (int i=0;i<11;i++){
15 for (int j=0;j<11;j++){
16 if (array1[i][j]!=0){
17 num++;
18 }
19 }
20 }
21 System.out.println("num="+num);
22
23 //开始定义稀疏数组
24 int[][] Sparse_array=new int[num+1][3];
25 Sparse_array[0][0]=11;
26 Sparse_array[0][1]=11;
27 Sparse_array[0][2]=num;
28
29 //再次遍历为稀疏数组赋值
30 int count=0;
31 for (int i=0;i<11;i++){
32 for (int j=0;j<11;j++){
33 if (array1[i][j]!=0){
34 count++;
35 Sparse_array[count][0]=i;
36 Sparse_array[count][1]=j;
37 Sparse_array[count][2]=array1[i][j];
38 }
39 }
40 }
41
42 //输出稀疏数组
43 System.out.println("+++++++++++++++++++++稀疏数组++++++++++++++");
44 for (int i=0;i<Sparse_array.length;i++){
45 System.out.printf("%d\t%d\t%d\t\n",Sparse_array[i][0],Sparse_array[i][1],Sparse_array[i][2]);
46 }
47 System.out.println();
48
49 //稀疏数组恢复
50 int[][] array2=new int[Sparse_array[0][0]][Sparse_array[0][1]];
51 //为稀疏数组循环并赋值
52 for (int i=1;i<Sparse_array.length;i++){
53 array2[Sparse_array[i][0]][Sparse_array[i][1]]=Sparse_array[i][2];
54 }
55
56 //显示恢复的数组
57 System.out.println("++++++++++++++++++恢复的数组+++++++++++++++");
58 for (int[] row:array2){
59 for (int item:row){
60 System.out.printf(item+"\t");
61 }
62 System.out.println();
63 }
64
65
关于为稀疏数组赋值理解:
count++;
Sparse_array[count][0]=i;
Sparse_array[count][1]=j;
Sparse_array[count][2]=array1[i][j];
为什么用count?
我们是用循环逐行赋值的,为一行赋值时,只有列会变,所以定义一个count锁定行
文章是看完尚学堂的韩顺平老师稀疏数组的课后写的,写下来希望加强下记忆