二維數組與稀疏數組的轉換---dataStructures

首先我們看一個需求

在11 * 11 的五子棋的棋盤中 我們使用0代表十字交叉點也是無效的數據 用1代表黑棋 用2代表藍棋
那麼所看到的棋盤如下

改用數字顯示後就如一下樣式

現在我們需要將怎個棋盤存儲起來,但是又發現有很多爲0 的無效數據,那麼我們就需要考慮將有效的數據存儲無效的數據不用存儲起來
這樣我們就可以使用稀疏數組將數據存儲起來

稀疏數組

稀疏數組有一定會有三行,列是隨有效數據的個數而變化的,先看一個稀疏數組的大概樣子

二維數組轉換爲稀疏數組的思路

  • 第一部 需要遍歷稀疏數組,獲取有效數據的個數(sum),改個數可以用來確定稀疏數組的行數,那麼稀疏數組的行數就是(sum + 1)【因爲稀疏數組的第一行是原始二維數組已經確定好了的】
//統計原始二維數組中的有效數據的個數,sum代表二維數組中有效數據的個數
        int sum = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j] != 0){
                    sum++;
                }
            }
        }
        System.out.println("有效數據的個數爲:" + sum);
  • 第二部 創建一個稀疏數組 int[][] sparseArr[sum +1 ][3]
        //1. 創建稀疏數組
        int sparseArr[][] = new int[sum + 1][3];
  • 第三部 遍歷稀疏數組中的有效數據的索引和值,並將有效數據存入稀疏數組中
         //給稀疏數組的第一行復制
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;              --sum(有效數據的個數)
        //2. 給稀疏數組賦值,count用於計數,計算該稀疏數組的第幾行
        int count = 0;
        for (int i = 0; i < chessArr.length; i++) {
            for (int j = 0; j < chessArr.length; j++) {
                if (chessArr[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr[i][j];
                }
            }
        }

稀疏數組轉換爲二維數組的思路

  • 第一部 讀取稀疏數組的第一行,利用第一行的數據,創建出沒有有效數據的二維數組 reChessArr = int[sparseArr[0][0]][sparseArr[0][1]];
    int reChessArr[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
  • 第二部 遍歷稀疏數組的後幾行數據,並且賦值給 reChessArr, 這樣就還原了有數據的二維數組
       //給還原後的二維數組賦值
        for (int i = 1; i < sparseArr.length; i++) {
            reChessArr[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

全部代碼地址

碼雲(gitee): dataStructures-sparseArray

github: dataStructures-sparseArray

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章