1. 程式人生 > 其它 >java實現稀疏矩陣的壓縮與解壓

java實現稀疏矩陣的壓縮與解壓

任務要求

把棋盤當作一個稀疏矩陣,0表示沒棋,1表示黑棋,2表示藍棋。

把該稀疏矩陣壓縮以三元組形式表示並以檔案形式儲存,再寫另一個程式讀取檔案中的資訊把壓縮後的三元組還原成原來的稀疏矩陣。

其中三元組的第一行用來儲存原始稀疏矩陣的行數、列數和有效的資料個數,其餘行用來儲存有效的非0資料

思路分析

稀疏矩陣的壓縮

  1. 遍歷原始的稀疏矩陣,得到有效的資料個數sum
  2. 根據sum建立三元組new int [sum+1] [3](即sum+1行3列的二維陣列)
  3. 將二維資料的有效資料存入三元組中

稀疏矩陣的解壓

  1. 先讀取三元組的第一行,根據第一行的資料建立一個二維陣列
  2. 再讀取三元組的後面幾行,並賦值給該二維陣列即可

程式碼實現

稀疏矩陣的壓縮

package zone.lxy.sparsearray;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

/*
* 把稀疏矩陣壓縮成三元組
* */
public class Compress {
    public static void main(String[] args) throws IOException {
        // 建立一個稀疏矩陣11*11
        // 0表示沒有棋子
        // 1表示黑子
        // 2表示白子
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;

        // 輸出原始的稀疏矩陣
        System.out.println("原始的稀疏矩陣:");
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                System.out.print(chessArr1[i][j] + " ");
            }
            System.out.println();
        }
        // 對稀疏矩陣壓縮儲存
        // 1.先遍歷稀疏矩陣記錄非0元素的個數
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }
        // 2.建立對應的三元組並初始化
        int[][] sparseArr = new int[sum + 1][3];
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;

        // 3.把稀疏矩陣中的非0元素放到三元組中
        int count = 1;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                    count++;
                }
            }
        }

        // 輸出生成的三元組
        System.out.println("得到壓縮後的三元組:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        // 把該三元組以檔案形式儲存起來,壓縮完成
        FileOutputStream fos = new FileOutputStream("map.data");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(sparseArr);
        oos.close();
        fos.close();
    }
}
// 輸出結果
原始的稀疏矩陣:
0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
得到壓縮後的三元組:
11 11 2 
1  2  1 
2  3  2 

稀疏矩陣的解壓

package zone.lxy.sparsearray;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

/*
* 把三元組還原成稀疏矩陣
* */
public class DeCompress {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 讀取檔案並賦值
        FileInputStream fis = new FileInputStream("map.data");
        ObjectInputStream ois = new ObjectInputStream(fis);
        int[][] sparseArr = (int[][]) ois.readObject();
        ois.close();
        fis.close();
        // 輸出檔案中的儲存的三元組
        System.out.println("得到壓縮後的三元組:");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%-2d %-2d %-2d\n", sparseArr[i][0], sparseArr[i][1], sparseArr[i][2]);
        }
        // 先讀取三元組的第一行,根據第一行資料建立原始的稀疏矩陣
        int row = sparseArr[0][0];
        int col = sparseArr[0][1];
        int[][] chessArr = new int[row][col];

        // 從第二行開始讀取三元組並賦值給稀疏矩陣
        for (int a = 1; a <sparseArr.length; a++) {
            int i = sparseArr[a][0];
            int j = sparseArr[a][1];
            int val = sparseArr[a][2];
            chessArr[i][j] = val;
        }
        // 輸出解壓後的稀疏矩陣
        System.out.println("解壓後的二維陣列:");
        for (int[] i : chessArr) {
            for (int item : i) {
                System.out.printf("%d ", item);
            }
            System.out.println();
        }
    }
}
// 輸出結果
得到壓縮後的三元組:
11 11 2 
1  2  1 
2  3  2 
解壓後的二維陣列:
0 0 0 0 0 0 0 0 0 0 0 
0 0 1 0 0 0 0 0 0 0 0 
0 0 0 2 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0