数据结构--稀疏数组

 一、稀疏数组

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

    如下所示。二维数组中只有两个数不为0,绝大部分为重复的数,所以可以使用稀疏数组,将二维数组转换为一个较小的数组,节省存储空间

    

 

 

   2、构成:稀疏数组为一个n行3列的二维数组。

      第一行:三列分别记录原二维数组的:总行数     总列数  不同于绝大部分重复值的总个数

      第二行:从原数组第一行开始,按行查找不同值。三列分别记录了

          第一个不同值的: 所在行数     所在列数      值

      第三行:从原数组第一行开始,按行查找不同值。三列分别记录了

          第二个不同值的: 所在行数     所在列数      值

      .........

      第n行:从原数组第一行开始,按行查找不同值。三列分别记录了

          第n-1个不同值的: 所在行数     所在列数      值

     

 

  3、稀疏数组的应用

    (一)二维数组转换为稀疏数组

      思路:1、遍历二维数组,得到不同值的个数sum。以(sum+1)作为稀疏数组的行数

         2、创建稀疏数组  int[][]  arrays=new int[sum+1][3]

         3、将二维数组的有效值存入稀疏数组中。

 

      代码实现:

    

 1  public static int[][] sour2sparse(int[][] sourArrays,String filename) {
 2         //0、创建一个 11*11的二维数组,并给其赋值
 3 //            int[][] sourArrays=new int[11][11];
 4 //            sourArrays[1][2]=1;
 5 //            sourArrays[2][3]=2;
 6         //1、遍历数组,获得值不为0的个数
 7         int sum = 0;
 8         for (int i = 0; i < sourArrays.length; i++) {
 9             for (int j = 0; j < sourArrays[i].length; j++) {
10                 if (sourArrays[i][j] != 0) {
11                     sum++;
12                 }
13             }
14         }
15         //2、创建稀疏数组,并赋值
16         int[][] sparseArrays = new int[sum + 1][3];
17         sparseArrays[0][0] = sourArrays.length;
18         sparseArrays[0][1] = sourArrays.length;
19         sparseArrays[0][2] = sum;
20         int cou = 0;
21         for (int i = 0; i < sourArrays.length; i++) {
22             for (int j = 0; j < sourArrays[i].length; j++) {
23                 if (sourArrays[i][j] != 0) {
24                     cou++;
25                     sparseArrays[cou][0] = i;//稀疏数组第n行1列,记录第n个不同值所在的行数i
26                     sparseArrays[cou][1] = j;//稀疏数组第n行2列,记录第n个不同值所在的列数j
27                     sparseArrays[cou][2] = sourArrays[i][j];//稀疏数组第n行3列,记录第n个不同值
28                 }
29             }
30         }
31         //3、将数组保存到文件中
32         try {
33             File file=new File(filename);
34             FileWriter fileWriter=new FileWriter(file);
35             //将数组中的数据写入到文件中。每行各数据之间TAB间隔
36             for(int i=0;i<sparseArrays.length;i++){
37                 for(int j=0;j<sparseArrays[i].length;j++){
38                     fileWriter.write(sparseArrays[i][j]+"\t");
39                 }
40                 fileWriter.write("\r\n");
41             }
42             fileWriter.close();
43         } catch (IOException e) {
44             e.printStackTrace();
45         }
46         return sparseArrays;
47     }

 

  (二)将稀疏数组转换为二维数组

     思路:1、读取稀疏数组第一行,获取二维数组的行列信息

        2、读取稀疏数组后面几行,获取不同值

     代码实现:

 1 /**
 2      *  * 稀疏数组转原始的二维数组的思路
 3      * 1. 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的  chessArr2 = int [11][11]
 4      * 2. 在读取稀疏数组后几行的数据,并赋给 原始的二维数组 即可.
 5      * @param sparseArrays 用于存储读取出的数组
 6      * @param filename 存储数组的文件路径
 7      * @return 返回一个原数组
 8      */
 9 public static int[][] sparse2sor(int[][] sparseArrays,String filename) {
10         try {
11             BufferedReader in = new BufferedReader(new FileReader(filename));
12             String line;  //一行数据
13             int row=0;
14             //逐行读取,并将每个数组放入到数组中
15             while((line = in.readLine()) != null){
16                 String[] temp = line.split("\t");
17                 for(int j=0;j<temp.length;j++){
18                     sparseArrays[row][j] = Integer.parseInt(temp[j]);
19                 }
20                 row++;
21             }
22             in.close();
23         } catch (IOException e) {
24             e.printStackTrace();
25         }
26         int[][] sourArrays2 = new int[sparseArrays[0][0]][sparseArrays[0][1]];//二维数组的行列数
27         for (int i = 1; i < sparseArrays.length; i++) {
28             sourArrays2[sparseArrays[i][0]][sparseArrays[i][1]] = sparseArrays[i][2];//对二维数组元素进行赋值
29         }
30         return sourArrays2;
31     }

 

 

      

     

 

 

 

 

 

 

 

 

 

    

posted @ 2020-04-14 21:09  凉凉快亮了  阅读(273)  评论(0)    收藏  举报