稀疏數組的學習

在這裏插入圖片描述

需求:框內是一個12*13的二維數組,現在想將其存儲起來。

因爲有許多值是0,這就會有許多沒有意義的數據。所以用普通的方法存儲會很耗空間。

一、基本介紹

  • 當數組中大多數元素爲零,可以使用稀疏數組來保存該數組,以此來達到節約空間的目的。

二、稀疏數組的結構

稀疏數組的列是固定的,爲行(row),列(col),值(value)。

第一部分:原始數組的行數,列數,值(有效的值的個數)
餘下的部分:原始數組中元素的行,列,值

在這裏插入圖片描述
如圖:
稀疏數組的第0行爲原數組的行數,列數,以及原數組的有效值的個數。(12,13,3)
第1行:原數組的行,列,以及值。(即是1行,2列,值是1)
第2行:即是3行,4列,值爲2。
第3行:即是5行,4列,值爲2。

前情提要
		//定義一個原始數組
        int sourceArray[][] = new int[12][13];
        sourceArray[1][2] = 1;
        sourceArray[3][4] = 2;
        sourceArray[5][4] = 2;

三、思路分析

1.將原數組轉爲稀疏數組

1.首先遍歷原始數組,得到有效數據的個數sum。(sum+1爲稀疏數組的長度)
2.根據sum創建稀疏數組SparseArray[sum+1][3]
3.將數據存入SparseArray[sum+1][3]
   (1)將原始數組的行數,列數,有效數據的個數分別存入SparseArray[0][0],SparseArray[0][1],SparseArray[0][2]。
   (2)遍歷原始數組,將有效數據存入到稀疏數組中。

- 代碼實現

        //遍歷原始二維數組,得到非0的值的個數,
        int sum = 0;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    sum++;
                }
            }
        }
        
       //創建稀疏數組
        int sparseArray[][] = new int[sum + 1][3];

        //給稀疏數組賦值
        sparseArray[0][0] = sourceArray.length; //原始二維數組的行數
        sparseArray[0][1] = sourceArray[0].length; //原始二維數組的列數
        sparseArray[0][2] = sum;//原始數組中非0的個數

        //用於記錄是第幾個非0數
        int count = 0;
        //遍歷數組,將非0的值存放到稀疏數組sparseArray中
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }
2.將稀疏數組轉成原始數組

1.首先獲取稀疏數組第一行的數據,根據第一行數據來創建原始數組。
2.遍歷讀取餘下的數據,並賦值給原始數組

- 代碼實現
		//創建原始的二維數組
		int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

		//遍歷,將值賦給原始數組
        for(int i=1;i<sparseArray.length;i++){
           sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
        }

四、完整代碼

package sparsearray;

public class SparseArray {

    public static void main(String[] args) {

        //定義一個原始數組
        int sourceArray[][] = new int[12][13];
        sourceArray[1][2] = 1;
        sourceArray[3][4] = 2;
        sourceArray[5][4] = 2;

        for (int[] row : sourceArray) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }


        //將原始數組轉成稀疏數組
        //遍歷原始二維數組,得到非0的值的個數,
        int sum = 0;
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    sum++;
                }
            }
        }
        System.out.println(sum);
        System.out.println(sourceArray.length);

        //創建稀疏數組
        int sparseArray[][] = new int[sum + 1][3];

        //給稀疏數組賦值
        sparseArray[0][0] = sourceArray.length; //原始二維數組的行數
        sparseArray[0][1] = sourceArray[0].length; //原始二維數組的列數
        sparseArray[0][2] = sum;//原始數組中非0的個數

        //用於記錄是第幾個非0數
        int count = 0;
        //遍歷數組,將非0的值存放到稀疏數組sparseArray中
        for (int i = 0; i < sourceArray.length; i++) {
            for (int j = 0; j < sourceArray[0].length; j++) {
                if (sourceArray[i][j] != 0) {
                    count++;
                    sparseArray[count][0] = i;
                    sparseArray[count][1] = j;
                    sparseArray[count][2] = sourceArray[i][j];
                }
            }
        }

        System.out.println("輸出稀疏數組");
        for (int[] row : sparseArray) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        //將稀疏數組在恢復成原始二維數組
        //創建原始的二維數組
        int sourceArr[][] = new int[sparseArray[0][0]][sparseArray[0][1]];

        //遍歷,將值賦給原始數組
        for(int i=1;i<sparseArray.length;i++){
           sourceArr[sparseArray[i][0]] [sparseArray[i][1]]=sparseArray[i][2];
        }


        System.out.println("輸出原數組");
        for (int[] row : sourceArr) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

    }
}

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