Live2D
Fork me on GitHub

1、稀疏数组

来源:https://www.bilibili.com/video/BV1B4411H76f?p=9

一、稀疏数组的基本介绍

  一个二维数组中,如果大部分元素为0,或者是同一个值,可以用一种更简单的方式存储该数组。

  1)记录二维数组有几行几列,一共有多少个值;

  2)记录这些值所在的位置及值的大小。

  这样形成的数组就是稀疏数组。

二、稀疏数组实例

  1、原始的二维数组

 1 0    0    0    0    0    0    0    0    0    0    0    
 2 0    0    1    0    0    0    0    0    0    0    0    
 3 0    0    0    2    0    0    0    0    0    0    0    
 4 0    0    0    0    0    0    0    0    0    0    0    
 5 0    0    0    0    0    0    0    0    0    0    0    
 6 0    0    0    0    0    0    0    0    0    0    0    
 7 0    0    0    0    0    0    0    0    0    0    0    
 8 0    0    0    0    0    0    0    0    0    0    0    
 9 0    0    0    0    0    0    0    0    0    0    0    
10 0    0    0    0    0    0    0    0    0    0    0    
11 0    0    0    0    0    0    0    0    0    0    0

  2、对应的稀疏数组

1 11   11   2    
2 1    2    1    
3 2    3    2

  稀疏数组中:

    第一行[11,11,2]表示原二维数组有11行11列2个值;

    第二行[1,2,1]表示下标为(1,2)的位置有一个值,值为1;

    同理,第三行[2,3,2]表示下标为(2,3)的位置有一个值,值为2。

三、应用实例

  1、问题描述

  1)把上述二维数组存为稀疏数组

  2)将存储后的稀疏数组恢复为原始数组

  2、思路

  1)二维数组→稀疏数组

    • 遍历原始数组得到有效数据的个数sum;

    • 根据sum创建稀疏数组spareArr [sum+1][3];

    • 将有效数据存储到稀疏数组。

  2)稀疏数组→二维数组

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

    • 读取稀疏数组后面的行,赋值给二维数组对应的位置。

  3、代码实现

  1)创建二维数组

 1 // 创建原始二维数组 11*11
 2 int chessArr1[][] = new int[11][11];
 3 chessArr1[1][2] = 1;
 4 chessArr1[2][3] = 2;
 5 //输出原始数组
 6 for(int[] row : chessArr1) {
 7     for(int data : row) {
 8         System.out.printf("%d\t",data);
 9     }
10     System.out.println();
11 }

  2)二维数组→稀疏数组

 1 //*************************将二维 转 稀疏
 2 //遍历得到非零数据个数
 3 int sum = 0;
 4 for(int i = 0;i < 11; i++) {
 5     for(int j = 0;j < 11; j++) {
 6     if(chessArr1[i][j] != 0) {
 7         sum++;
 8     }
 9     }            
10 }
11         
12 //创建稀疏
13 int sparseArr[][] = new int[sum+1][3];
14 sparseArr[0][0] = 11;
15 sparseArr[0][1] = 11;
16 sparseArr[0][2] = sum;
17         
18 //稀疏赋值
19 int count = 0;//记录是第几个非零数据
20 for(int i = 0;i < 11; i++) {
21     for(int j = 0;j < 11; j++) {
22         if(chessArr1[i][j] != 0) {
23             count++;
24             sparseArr[count][0] = i;
25             sparseArr[count][1] = j;
26             sparseArr[count][2] = chessArr1[i][j];
27         }
28     }            
29 }
30         
31 //输出
32 System.out.println();
33 System.out.println("得到的稀疏数组为:");
34 for(int i = 0; i < sparseArr.length; i++) {
35     System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
36 }
37 System.out.println();

  3)稀疏数组→二维数组

//***********************稀疏恢复
int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
for(int i = 1;i < sparseArr.length; i++) {
    chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
                        
}
        
//输出
System.out.println();
System.out.println("恢复的二维数组为:");
for(int[] row : chessArr2) {
    for(int data : row) {
        System.out.printf("%d\t",data);
    }
    System.out.println();
}

 

    

posted @ 2020-05-14 16:28  -小二黑-  阅读(230)  评论(0编辑  收藏  举报