數據結構與算法_1.稀疏數組和隊列

1. 稀疏數組和隊列

1.1 稀疏(sparsearray)數組


  • 基本概念
    • 當一個數組中大部分元素爲0,或者爲同一個值的數組時,可以使用稀疏數組來保存該數組。
  • 處理方法
    • 記錄數組一共有幾行幾列,有多少個不同的值。
    • 把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模
  • 舉例
    • 普通數組在這裏插入圖片描述
    • 稀疏數組稀疏數組
  • 代碼實現
public class AparseArray {
    public static void main(String[] args) {
        // 1.創建一個原始的二維數組:11*11
        // 1.1 0表示沒有棋子,1表示黑子,2表示藍子
        int chessArr1[][] = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        // 1.2 輸出原始二維數組
        System.out.println("原始二維數組爲:");
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        // 2.將二維數組轉爲稀疏數組
        // 2.1 遍歷二維數組,得到非零數據的個數
        int sum = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }
        // 2.2 創建對應的稀疏數組
        int sparseArr[][] = new int[sum + 1][3];
        // 2.3 給稀疏數組賦值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        // 2.4 遍歷二維數組,將非0的值存放到sparseArr中
        int count = 0;
        for (int i = 0; i < chessArr1.length; i++) {
            for (int j = 0; j < chessArr1.length; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }
        // 2.5 輸出稀疏數組
        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]);
        }

        // 3.將稀疏數組恢復成原始二維數組
        // 3.1 先讀取稀疏數組的第一行,根據第一行的數據,創建原始二維數組
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        // 3.2 再讀取稀疏數組後幾行的數據,並賦給原始二維數組即可
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        // 3.3 輸出恢復後的二維數組
        System.out.println("恢復後的二維數組爲:");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }
}

運行結果爲:

原始二維數組爲:
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 
恢復後的二維數組爲:
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

1.2 隊列


  • 基本概念
    • 隊列是一個有序列表,可以用數組或是鏈表來實現。
    • 遵循先入先出的原則。即:先存入隊列的數據,要先取出。後存入的要後取出
    • 示意圖:在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章