稀疏數組

1、引入小程序

  先來看一個實際問題:數組

  •  編寫的五子棋程序中,有存盤退出和續上盤的功能

  

  如上圖,0表示沒有棋子,1表示黑色棋子,2表示藍色棋子spa

  • 問題分析:由於該二維數組不少值是默認值0,所以記錄了不少沒有意義的數據。
  • 解決方案:用稀疏數組代替二維數組

 

2、稀疏數組3d

  • 基本介紹:當一個數組中大部分元素爲0,或者爲同一個值時,能夠使用稀疏數組來保存該數組
  • 稀疏數組的處理方法是:
  1. 記錄數組一共有幾行幾列,有多少個不一樣的值
  2. 把具備不一樣值的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
  • 舉例說明:

       

        該二維數組的大小爲6*7,除0外共有8個不一樣的值,所以稀疏數組的第一行爲[6 7 8], 而後將8個不一樣的值依次記錄到稀疏數組中。 如二維數組中的「22」 位於第0行第3列,則稀疏數組第二行爲[0 3 22]。同理可得剩餘的值。code

       

 

3、 代碼實現blog

 

public class SparseArray {

    public static void main(String[] args) {
        // 建立一個原始的二維數組11*11
        // 0:表示沒有棋子, 1:表示黑子  2:表示藍子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //輸出原始的二維數組
        System.out.println("原始的二維數組:");
        for (int[] row : chessArr1) {
            for (int data: row) {
                System.out.printf("%d\t", data);
            }
            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 sparseArray[][] = new int[sum+1][3];
        //3. 給稀疏數組賦值
        sparseArray[0][0] = 11;
        sparseArray[0][1] = 11;
        sparseArray[0][2] = sum;
        
        // 遍歷二維數組,將非0的值存放到sparseArray中
        int count = 0;
        for (int i = 0; i < 11; i++) {
            for (int j =0; j < 11; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = chessArr1[i][j];
                }
            }
        }
        
        // 輸出稀疏數組的形式
        System.out.println();
        System.out.println("獲得的稀疏數組爲:");
        for (int i =0; i < sparseArray.length; i++) {
            System.out.printf("%d\t%d\t%d\t\n", sparseArray[i][0], sparseArray[i][1], sparseArray[i][2]);
        }
        System.out.println();
        
        //將稀疏數組恢復成二維數組
        // 1.先讀取稀疏數組的第一行,根據第一行的數據建立原始的二維數組
        int a = sparseArray[0][0];
        int b = sparseArray[0][1];
        int chessArr2[][] = new int[a][b];
        
        // 2.再讀取稀疏數組後幾行的數據,並賦給 原始的二維數組
        for (int i = 1; i < sparseArray.length; i++) {
            chessArr2[sparseArray[i][0]][sparseArray[i][1]] = sparseArray[i][2];
        }
        System.out.println("恢復後的二維數組:");
        for (int[] row : chessArr2) {
            for (int data: row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }        
    }

}
相關文章
相關標籤/搜索