数据结构01--稀疏数组

稀疏数组

  • 基本介绍:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。

    第一行:记录数组共有几行,几列,多少个不同的值;

    把具有不同值的元素的行,列,值,记录在一个小规模的数组中,从而缩小程序的规模。

  • 处理方法:

    • 记录数组一共有几行几列,有多少个不同的值;

    • 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模。

  • 示例:五子棋的存盘退出及续上盘功能。存在很多的无意义数据(0),由此提出稀疏数组。

    11 11 2
    1 2 1
    2 3 2

 

 

 

 

 

转换思路

  1. 二维数组转稀疏数组

    • 遍历原始的二维数组,得到有效数据的个数为notZeroValueNumberCalc;

    • 根据sum来创建稀疏数组sparseArr int[notZeroValueNumberCalc+1] [3];

    • 将二维数组的有效数据存入到稀疏数组中;

  2. 稀疏数组转二维数组

    • 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组;

    • 在读取稀疏数组后几行的数据,并赋给原始的二维数组即可。

 1 import java.io.IOException;
 2 import java.util.Arrays;
 3 
 4 public class SparseArray {
 5     public static void main(String[] args) throws IOException {
 6         // 创建一个原始二维数组 11 * 11
 7         // 0:无棋子  1:黑子  2:白子
 8         int chessArr1[][] = new int[11][11];
 9         chessArr1[1][2] = 1;
10         chessArr1[2][3] = 2;
11         chessArr1[8][8] = 2;
12         chessArr1[4][10] = 2;
13         chessArr1[4][10] = 1;
14         chessArr1[10][0] = 1;
15         // 原始二维数组 增强循环输出
16         System.out.println("=====TEST0=====");
17         //Test Unit
18         for (int[] tmpArr :chessArr1) {
19             for (int i :tmpArr) {
20                 System.out.print(i+"\t");
21             }
22             System.out.println();
23         }
24 
25         System.out.println("=======Transfer Begin=======");
26         //==开始转换
27         //1 遍历原始的二维数组,得到有效数据的个数为notNullValueNumberCalc
28         int notZeroValueNumberCalc = 0;
29         for (int[] tmpRow:chessArr1) {
30             for (int i:tmpRow) {
31                 if (0!=i) notZeroValueNumberCalc++;
32             }
33         }
34 
35         //2 根据notNullValueNumberCalc来创建稀疏数组SparseArr int[sum+1] [3]
36         int sparseArr[][] = new int[notZeroValueNumberCalc+1][3];
37         sparseArr[0][0] = chessArr1.length; //获取行数
38         sparseArr[0][1] = chessArr1[0].length;  //将第一行抽取出来,获取一维数组的长度==>列数
39         sparseArr[0][2] = notZeroValueNumberCalc;   //存储遍历得到的非0个数
40 
41         //3 将二维数组的有效数据存入到稀疏数组中
42         //定义行列索引变量
43         Integer inputSparseArrNum = 0;
44         //循环遍历,当值非0时,将行列索引赋值给变量并存入稀疏数组中,再继续遍历
45         for (int row = 0; row < sparseArr[0][0]; row++) {
46             for (int col = 0; col < sparseArr[0][1]; col++) {
47                 if (chessArr1[row][col]!=0){
48                     inputSparseArrNum++;
49                     sparseArr[inputSparseArrNum][0] = row;
50                     sparseArr[inputSparseArrNum][1] = col;
51                     sparseArr[inputSparseArrNum][2] = chessArr1[row][col];
52                 }
53             }
54         }
55         System.out.println("=====TEST1=====");
56         //Test Unit
57         for (int[] tmpArr :sparseArr) {
58             for (int i :tmpArr) {
59                 System.out.print(i+"\t");
60             }
61             System.out.println();
62         }
63         System.out.println("=======Transfer End=======");
64         //output
65         //Obj2LocalUtil.Array2Local(sparseArr);
66         System.out.println("=======Transfer Begin=======");
67         //逆向转换至二维数组
68         //1 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组
69         int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
70         //2 在读取稀疏数组后几行的数据,并赋给原始的二维数组
71         //从稀疏数组的第2行开始遍历,第一行已用于创建二维数组
72         for (int row = 1; row < sparseArr.length; row++) {
73             chessArr2[sparseArr[row][0]][sparseArr[row][1]] = sparseArr[row][2];
74         }
75 
76         System.out.println("=====TEST2=====");
77         //Test Unit
78         for (int[] tmpArr :chessArr2) {
79             for (int i :tmpArr) {
80                 System.out.print(i+"\t");
81             }
82             System.out.println();
83         }
84         System.out.println("=======Transfer End=======");
85     }
86 }
View Code

 

posted @ 2020-06-23 00:23  hxiuz  阅读(126)  评论(0编辑  收藏  举报