1. 程式人生 > 實用技巧 >資料庫週刊31丨openGauss 正式開源;7月資料庫排行榜釋出;浙江移動國產資料庫AntDB遷移;oracle ADG跨版本搭建;PG解決社保問題;mysqlbinlog解析……

資料庫週刊31丨openGauss 正式開源;7月資料庫排行榜釋出;浙江移動國產資料庫AntDB遷移;oracle ADG跨版本搭建;PG解決社保問題;mysqlbinlog解析……

稀疏陣列

矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分佈沒有規律時,則稱該矩陣為稀疏矩陣;與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。

最常用的稀疏矩陣儲存格式為列壓縮儲存(compressedcolumn storage,CCS) 或行壓縮儲存( ompressedrow storage,CRS)。

  • 需求:編寫五子棋遊戲中,有存檔退出和續上盤的功能。

    如:黑棋用1代表,白棋用2代表

  • 分析問題:因為該二維陣列的很多值是預設值為0,因此記錄了很多沒有意義的資料。

  • 解決:稀疏陣列

稀疏陣列介紹

  • 當一個數組中大部分元素為0,或者為同一值得陣列時,可以使用稀疏陣列來儲存該陣列。
  • 稀疏陣列的處理方式是:
    • 記錄陣列一共有幾行幾列,有多少個不同值
    • 把具有不同值得元素和行列及值記錄在一個小規模得陣列中,從而縮小程式的規模
  • 如下圖:左邊是原始陣列,右邊是稀疏陣列。

用程式碼記錄稀疏陣列及還原

public class ArrayDemo08 {
    public static void main(String[] args) {
        //1.建立一個二維陣列    11*11   0:沒有棋子  1:黑棋    2:白棋
        int[][] array1 = new int[11][11];
        array1[1][2] = 1;
        array1[2][3] = 2;
        //輸出原始的陣列
        System.out.println("輸出原始的陣列");

        for (int[] ints : array1) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }

        System.out.println("====================");

        //轉換為稀疏陣列儲存
        //獲取有效值的個數
        int sum = 0;
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (array1[i][j]!=0){
                    sum++;
                }

            }

        }
        System.out.println("有效值的個數:" + sum);


        //2.建立一個稀疏陣列的陣列
        int[][] array2 = new int[sum+1][3];

        array2[0][0] = 11;
        array2[0][1] = 11;
        array2[0][2] = sum;

        //遍歷二維陣列,將非零的值,存放在稀疏陣列中
        int count = 0;
        for (int i = 0; i < array1.length; i++) {
            for (int j = 0; j < array1[i].length; j++) {
                if (array1[i][j]!=0){
                    count++;
                    array2[count][0] = i;
                    array2[count][1] = j;
                    array2[count][2] = array1[i][j];
                }
            }

        }

        //輸出稀疏陣列
        System.out.println("稀疏陣列");

        for (int i = 0; i < array2.length; i++) {
            System.out.println(array2[i][0]+"\t"
                    +array2[i][1]+"\t"
                    +array2[i][2]+"\t");
        }

        System.out.println("==============");
        System.out.println("還原");
        //1.讀取稀疏陣列
        int[][] array3 = new int[array2[0][0]][array2[0][1]];

        //2.給其中的元素還原它的值
        for (int i = 1; i < array2.length; i++) {
            array3[array2[i][0]][array2[i][1]] = array2[i][2];
        }
        //3.列印
        System.out.println("輸出還原的陣列");

        for (int[] ints : array3) {
            for (int anInt : ints) {
                System.out.print(anInt+"\t");
            }
            System.out.println();
        }
    }
}