【數據結構】稀疏數組(Java實現)

1.1 稀疏數組

實際問題

實際案例:編寫的五子棋程序中,有和續上盤的功能。

棋盤保存

存在問題:

因爲該二維數組的很多值是默認值0, 因此記錄了很多沒有意義的數據->稀疏數組。

什麼是稀疏數組

當一個數組中大部分元素爲0,或者爲同一個值的數組時,可以使用稀疏數組來保存該數組。

稀疏數組的處理方法是:

  1. 記錄數組一共有幾行幾列,有多少個不同的值
  2. 把具有不同值的元素的行列及值記錄在一個小規模的數組中,從而縮小程序的規模

轉換邏輯

二維數組轉稀疏數組的思路
1.遍歷原始的二維數組,得到有效數據的個數sum
2.根據sum就可以創建稀疏數組sparseArray= int[sum+ 1][3]
3.將二維數組的有效數據數據存入到稀疏數組
稀疏數組轉原始的二維數組的思路
1.先讀取稀疏數組的第-行,根據第一行的數據,創建原始的二維數組,比如下面的chessArr2 =int[6][7]
2.在讀取稀疏數組後幾行的數據,並賦給原始的二維數組即可.

轉換邏輯

Java代碼實現

二維數組轉換爲稀疏數組

/**
 * 二維數組轉換爲稀疏數組
 * @param sourceArray 原始的二維數組
 * @return 轉換後的稀疏數組
 */
public static int[][] array2SparseArray(int[][] sourceArray){
    if (sourceArray == null) {
        return null;
    }
    //用來保存有效數字的個數
    int significantNumber = 0;
    //保存數組的行號
    int rowCount = sourceArray.length;
    int colCount = 0;
    //遍歷數組獲取有效數字的個數
    for(int row = 0;row<rowCount;row++){
        colCount = sourceArray[row].length;
        for(int col = 0;col<colCount;col++){
            //判斷是否爲有效數字,增加有效數字的個數
            if(sourceArray[row][col]!=0){
                significantNumber++;
            }
        }
    }
    //初始化轉換後的稀疏數組
    int[][] sparseArray = new int[significantNumber + 1][3];
    //稀疏數組的第一行的第一個值爲原數組行數
    sparseArray[0][0] = rowCount;
    //稀疏數組的第一行的第二個值爲原數組列數
    sparseArray[0][1] = colCount;
    //稀疏數組的第一行的第三個值爲原數組的有效數字的個數
    sparseArray[0][2] = significantNumber;

    //記錄第幾個有效數字
    int count = 0;
    for(int row = 0;row<rowCount;row++){
        colCount = sourceArray[row].length;
        for(int col = 0;col<colCount;col++){
            //判斷是否爲有效數字,記錄有效數字的位置和具體值
            if(sourceArray[row][col]!=0){
                count++;
                sparseArray[count][0] = row;
                sparseArray[count][1] = col;
                sparseArray[count][2] = sourceArray[row][col];
            }
        }
    }
    return sparseArray;
}

稀疏數組轉化爲原數組

/**
 * 稀疏數組轉化爲原數組
 * @param sparseArray 稀疏數組
 * @return 原數組
 */
public static int[][] sparseArray2Array(int[][] sparseArray){
    if (sparseArray == null) {
        return null;
    }
    int row = sparseArray[0][0];
    int col = sparseArray[0][1];
    int num = sparseArray[0][2];
    int[][] sourceArray = new int[row][col];
    //初始化原數組信息
    for(int i = 1;i<=num;i++){
        sourceArray[sparseArray[i][0]][sparseArray[i][1]]=sparseArray[i][2];
    }
    return sourceArray;
}

打印數組的方法

/**
 * 給定數組打印其結構
 * @param array 需要打印的數組
 */
private static void showArray(int [][] array){
    if (array == null) {
        System.out.print("打印數字不能爲空!");
    }
    for(int[] rowData: Objects.requireNonNull(array)){
        for(int colData:rowData){
            System.out.print(colData+"\t");
        }
        System.out.println();
    }
}

測試方法

public static void main(String[] args) {
    int[][] sourceArray = new int[6][7];
    sourceArray[0][0]=2;
    sourceArray[5][3]=2;
    sourceArray[4][3]=2;
    sourceArray[3][4]=2;
    System.out.println("轉換前的數組爲:");
    //轉換前的數組
    SparseArray.showArray(sourceArray);
    sourceArray = SparseArray.array2SparseArray(sourceArray);
    System.out.println("轉換後的數組爲:");
    //轉換後的稀疏數組
    SparseArray.showArray(sourceArray);
    System.out.println("重新hryr後的數組爲:");
    sourceArray = SparseArray.sparseArray2Array(sourceArray);
    SparseArray.showArray(sourceArray);

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