【Java數據結構與算法】稀疏數組

數據結構類型

數據結構包括:線性結構和非線性結構。


線性結構與非線性結構

線性結構

  1. 線性結構作爲最常用的數據結構,其特點是數據元素之間存在一對一的線性關係
  2. 線性結構有兩種不同的存儲結構,即順序存儲結構和鏈式儲存結構。順序存儲的線性表稱爲順序表,順序表中的存儲元素是連續的
  3. 鏈式存儲的線性表稱爲鏈表,鏈表中的儲存元素不一定是連續的,元素節點種存放數據元素以及相鄰元素的地址信息
  4. 線性結構常見的有:數組,隊列,鏈表和棧

非線性結構
非線性結構包括:二維數組,多維數組,廣義表,樹結構,圖結構。

稀疏數組

基本介紹
當一個數組種大部分元素爲0,或者爲同一個值的數組時,可以使用稀疏數組來保存該數組。
稀疏數組的處理方法

  1. 第一行記錄數組一共有幾行幾列,有多少個不同的值。
  2. 把具有不同值的元素的行列及值記錄在一個小規模的數組種,從而縮小程序的規模。
實例應用
  1. 使用稀疏數組,來保留類似前面的二維數組(棋盤,地圖等等)
  2. 把稀疏數組存盤,並且可以從新恢復到原來的二維數組
  3. 整體思路分析

稀疏數組舉例說明

實際應用與轉化圖像如下↓
在這裏插入圖片描述

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

代碼實例

//二維數組轉稀疏數組轉二維數組
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.print("%d\t" + data);
            }
            System.out.println();
        }
        //將二維數組轉爲稀疏數組
        //1.先遍歷二維數組得到非0數據的個數
        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.創建對應的稀疏數組
        int sparseArr[][] = new int[sum + 1][3];
        //給稀疏數組賦值
        sparseArr[0][0] = 11;
        sparseArr[0][1] = 11;
        sparseArr[0][2] = sum;
        //遍歷二維數組,將非0的值存放到稀疏數組種
        int count = 0; //coun 用於記錄第幾個非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];
                }
            }
        }
        //輸出稀疏數組的形式
        System.out.println();
        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();
        /*將稀疏數字恢復成原始的二維數組
        //先讀取稀疏數組的第一行,根據第一行的數據,窗口原始二維數組,比如上面的chessArr2=int[11][11];
        在讀取稀疏數組後幾行的數據(從第二行開始),並賦給這個原始的二維數組即可。*/
        int chessArr2[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        for (int i = 1;i < sparseArr.length; i ++){
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        //輸出恢復後的二維數組
        System.out.println();
        System.out.println("恢復後的二維數組~~");
        for (int[] row : chessArr2){
            for (int data : row){
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }
    }
}

編程我也是初學者,難免有寫錯的地方,希望大家看完之後,發現錯誤可以評論出來,謝謝大家

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