Java数据结构——稀疏数组

SparseArray原理

将数组中大部分为 0 或者是同一个值的的元素保存起来,第一行存放二维数组的 行 和 列 以及元素有效值个数,用 行列 来标记不同与其它的元素值和它的位置。

应用场景

例如:编写一个五子棋(11×11)chess程序中,有存盘退出及续上盘的功能

                       

因为二维数组有很多默认值0,记录了许多无意义的数据

当一个数组中大部分元素为 0 或者是同一个值的数组,故可以使用稀疏数组来保存该数组

处理方法:

1.记录数组一共有几行几列,有多少个不同的值。

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

 

 

原始二维数组转稀疏数组的思路

1.遍历原始二维数组有效数据的个数sum

2.根据sum,创建稀疏数组sparseArray[sum+1][3]

3.将原始二维数组有效数据存入稀疏数组中

稀疏数组转原始二维数组的思路

1.读取稀疏数组第一行的数据,根据第一行的数据创建原始二维数组

2.在读取稀疏数组后几行的数据,赋给原始二维数组

 

代码如下:

 1 package com.taru.sparsearray;
 2 
 3 public class SparseArray {
 4     public static void main(String[] args) {
 5         //二维数组转稀疏数组
 6         //1.创建一个11*11的二维数组
 7         // 0代表没有棋子 ,1代表黑棋,2代表白棋
 8         int[][] chess = new int[11][11];
 9         chess[1][2]=1;
10         chess[2][3]=2;
11         chess[4][5]=1;
12         //输出原始二维数组chess
13         System.out.println("输出原始数组------");
14         for(int[] array : chess){
15             for (int data :array){
16                 System.out.printf("%d\t" , data);
17             }
18             System.out.println();
19         }
20         //2.遍历二维数组非0个数
21         int sum =0;
22         for(int[] array : chess){
23             for (int data :array){
24                 if (data!=0) sum++;
25             }
26         }
27         //2.创建对应的稀疏数组
28         int[][] sparseArray =new int[sum+1][3];
29         //给稀疏数组赋值
30         sparseArray[0][0] = 11; //chess行数
31         sparseArray[0][1] = 11;//chess列数
32         sparseArray[0][2] = sum;//chess非零个数
33         //3.遍历chess数组,将非零值存放到sparseArray中
34         int count =0;
35         for (int i = 0 ;i<chess.length;i++){
36             for (int j=0;j<chess[i].length;j++){
37                 if (chess[i][j]!=0){
38                     count++;
39                     sparseArray[count][0]=i;
40                     sparseArray[count][1]=j;
41                     sparseArray[count][2]=chess[i][j];
42                 }
43             }
44         }
45         //输出sparseArray数组
46         System.out.println("输出稀疏数组------");
47         for (int[] item:sparseArray){
48             System.out.printf("%d\t%d\t%d\t\n",item[0],item[1],item[2]);
49         }
50
51         //稀疏数组还原原始数组
52         int [][] chess2 = new int[sparseArray[0][0]][sparseArray[0][1]];
53         for (int i =1 ;i<sparseArray.length;i++){
54             chess2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
55         }
56         //输出被还原的原始数组
57         System.out.println("输出被还原的原始数组-------");
58         for(int[] array : chess2){
59             for (int data :array){
60                 System.out.printf("%d\t" , data);
61             }
62             System.out.println();
63         }
64     }
65 }

 

posted on 2020-08-09 12:40  晴天在下雨  阅读(206)  评论(0)    收藏  举报

导航