數據結構和算法(1)-- 稀疏數組(java代碼實現)

1.數據結構

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

     線性結構:

            > 線性結構是最常用的數據結構,他的特點是數據元素之間存在一對一的線性關係。

            > 線性結構有兩種不同的存儲結構:順序存儲結構和鏈式存儲結構。一般順序存儲的線性表稱爲順序表,順序表中存儲元素是連續的。

            > 鏈式存儲的線性表稱爲鏈表,鏈表中存儲的元素不一定是連續的,元素節點中存放數據元素以及相鄰元素的地址信息。但是鏈表的實際結構中相鄰的元素並不是挨在一起,只是通過next域來指定理論上相鄰元素的地址。

     非線性結構:

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

2. 稀疏數組 

在實際生活中,類似於棋盤,地圖等程序需要進行存盤或者退出,但是需要保存之前的記錄。但是二維數組的很多值都爲0,如果我們將這些爲0的值也都保存起來,就大大佔用的了我們程序得進程和效率,於是有了稀疏數組。這個數組保存了還原這樣一個二維數組的一些結構信息。當我們保存的時候就將二維數轉換爲稀疏數組保存,當我們還原二維數組時,就拿稀疏數組進行還原,可以提高我們程序得存儲效率。

稀疏數組的處理方法是:

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

3. Java代碼實現一個二維數組和稀疏數組的轉換操作 

3.1 首先我們創建一個二維數組,類似於五子棋的棋盤。

public class SparseArray {
    public static void main(String[] args) {
        //創建一個原始的二維數組 11*11
        //0:表示沒有棋子,1:表示黑色棋子,2:表示藍色棋子
        int sparseArr1[][] = new int[11][11];
        sparseArr1[1][2] = 1;
        sparseArr1[2][3] = 2;
        //輸出原始的二維數組
        System.out.println("原始的二維數組");

        for (int[] ints : sparseArr1) {
            for (int data : ints) {
                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

3.2 將上面的二維數組轉換成稀疏數組:

  //1.先遍歷二維數組,得到非0數據的個數  sum=2
        int sum = 0;
        for (int i = 0; i < sparseArr1.length; i++) {
            for (int j = 0; j <sparseArr1.length ; j++) {
                if (sparseArr1[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值存放到sparseArry中
        int count = 0;//count 用於記錄是第幾個非0數據
        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                if (sparseArr1[i][j] != 0){
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = sparseArr1[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();

 這樣就得到一個稀疏數組:

稀疏數組爲:
11	11	2	
1	2	1	
2	3	2	

3.3 利用稀疏數組的結果轉換爲原始的二維數組:

        //1.先讀取稀疏數組第一行,根據第一行數據,創建原始的二維數組
        int sparseArr2[][]  = new int[sparseArr[0][0]][sparseArr[0][1]];
        //2.在讀取稀疏數組後幾行數據(從第二行開始),並賦值給原始的二維數據即可
        for (int i = 1; i <sparseArr.length ; i++) {
            sparseArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }
        //輸出恢復後二維數組
        System.out.println();
        System.out.println("恢復後的二維數組");

        for (int[] row : sparseArr2) {
            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	

以上就完成了原始二維數組--稀疏數組--原始二維數組的轉換。

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