數據結構---稀疏數組

稀疏數組是一種壓縮事後的數組

爲何要壓縮? 由於在有些狀況下,數組中存在大量的無效數據,若是所有保存的後會很大的影響效率,這時候就可使用稀疏數組

舉例瞭解

五子棋一種簡單的遊戲,有時候咱們須要將未下完的棋進行保存,那麼棋盤上確定保留了一些空的地方,在程序中咱們可使用二維數組來實現棋盤,那麼未落子的地方就是0

代碼示例

使用代碼模擬棋盤(二維數組)java

public static void main(String[] args) {
        //棋盤上 0 表示 沒有棋子 ,1 表示黑子 2 表示紅子
        //建立一個原始的二維數組,看成棋盤    
        int chessArr1[][] = new int[11][11];
        //給棋盤上一些值
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //打印棋盤
        //便利數組每一行的值賦給 row
        System.out.println("原始的二維數組");
        for(int[] row : chessArr1) {
            //便利 row 的值 賦值給 data
            for(int data : row) {
                //格式化打印棋盤上的數據
                System.out.printf("%d\t",data);
            }
            //換行
            System.out.println();
        }
    }

上述代碼模擬實現了五子棋中棋盤落子的狀況,其中 1 表示 黑子,2 表示 紅子 ,0 表示 未下子

執行結果
數組

將二維數組轉換爲稀疏數組bash

public static void main(String[] args) {
        
        //將二維數組轉換爲稀疏數組
        //1. 遍歷 二維數組 獲得非0 數據的個數
        //非0 個數
        int sum = 0;
        //遍歷二維數組的行數
        for (int i = 0; i < chessArr1.length; i++) {
            //遍歷二維數組的列數
            for (int j = 0; j < chessArr1.length; j++) {
                //值不爲0 將他的個數記錄下來
                if(chessArr1[i][j] !=0 ) {
                    
                    sum ++ ;
                }
            }
        }
        System.out.println("sum = "+sum);
        //建立稀疏數組
        //稀疏數組 的 行爲有效數據中個數+1 固定時3 列
        int sparseArr[][] = new int[sum+1][3];
        //稀疏數組 第一行第一列的數據
        sparseArr[0][0] = chessArr1.length;
        //稀疏數組 第一行第2列的數據
        sparseArr[0][1] = chessArr1.length;
        //稀疏數組 第一行第3列的數據
        sparseArr[0][2] = sum;
        //遍歷二維數組將 非0 數據放入稀疏數組
        //計數器 ,用來計算 當前數第幾行
        int count = 0 ;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                //當二維數組中數據不爲0 時 放到稀疏數組中
                if(chessArr1[i][j]!=0) {
                    count ++;
                    //稀疏數組從第二行開始 每列的數值
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }
        //輸出稀疏數組
        System.out.println("稀疏數組");
        for (int i = 0; i < sparseArr.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n",sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
        }
        System.out.println("");

執行結果spa

其中由於稀疏數組的列是固定的3 列 ,並且 第一行第一例的數據是二維數組的總行數,第一行第二列的數據是 二維數組的總列數,第一行 第三列的數據是二維數組中有效數據(不爲0)的總個數
從第二行起 沒第一列表明該有效數據的行數,第二列代碼該有效數據的列數,第三列表明該有效數據的具體的值
由此咱們能夠建立並給稀疏數組賦值

將稀疏數組轉換爲二維數組code

public static void main(String[] args) {
        //將稀疏數組 轉爲 二維數組
        //1. 稀疏數組的第一行 第一列和第二列 存放的是 二維數組的行列 
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2. 從第二行開始將 稀疏數組中的數據賦值給 二維數組 由於都是有效數據 ,不用判斷爲0 
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        System.out.println("恢復後的二維數組");
        for(int[] row : chessArr2) {
            //便利 row 的值 賦值給 data
            for(int data : row) {
                //格式化打印棋盤上的數據
                System.out.printf("%d\t",data);
            }
            //換行
            System.out.println();
        }
    }
在轉換回去時咱們從稀疏數組的第一行第一列,第一行第二列 獲取須要建立的二維數組的大小
而後從第二行開始 循環的將 第一列,第二列的 值(稀疏數組的第三列)賦值給二維數組便可

執行結果
blog

相關文章
相關標籤/搜索