稀疏數(shù)組

搞清楚稀疏數(shù)組之前,先得知道什么是二維數(shù)組

二維數(shù)組

二維數(shù)組相當(dāng)于一維數(shù)組里面存了些一維數(shù)組

int[] a={1,2};

int[] b={3,4};

int[][] ab={a,b}; //里面放a,b數(shù)組
內(nèi)存中位置.png

稀疏數(shù)組

稀疏數(shù)組.png

可以看到圖中 只有幾個是有效數(shù)字 其他是無效的,很占空間

所以我們可以通過壓縮的方式,將數(shù)組變小
具體規(guī)則

  • 首行這個數(shù)組有 幾行幾列 幾個有效值(不為0都是有效值)
  • 其他行第幾行 第幾列 有效數(shù)字是多少
7 8 3
3 5 1
4 5 2
6 8 4

PS:有些博客第一行第一列會寫成 0,0
eg.上面的第三行第五列

3 5 1

會寫成 對應(yīng)數(shù)組下標(biāo)的方式

2 4 1

個人覺得我這樣方便閱讀一點

上代碼:

  1. 壓縮

                               //array[x][y]
    public int[][] compressArray(int array[][]){

        //記錄有幾個有效數(shù)字
        int sum=0;
        for (int i = 0; i <array.length ; i++) { //有多少行 x
            for (int j = 0; j <array[0].length ; j++) { //有多少列 y 隨便算哪行的長度array【i】.lenth 因為列是固定
                if(array[i][j]!=0){
                    sum++;
                }
            }
        }
        //初始化壓縮后的數(shù)組   sum+1是因為首行要放幾行幾列等有效數(shù)據(jù)
        int[][] endArray=new int[sum+1][3];
        //首行信息
        endArray[0][0]=array.length;
        endArray[0][1]=array[0].length;
        endArray[0][2]=sum;

        int count=1; //標(biāo)記給哪行賦值 從第二行開始
        //給壓縮后的數(shù)組賦值
        for (int i = 0; i <array.length ; i++) {
            for (int j = 0; j <array[0].length ; j++) {
                if(array[i][j]!=0){
                    endArray[count][0]=i+1;  //因為數(shù)組是從0開始 而我們一般從第一行開始,所以這里+1 方便閱讀
                    endArray[count][1]=j+1;
                    endArray[count][2]=array[i][j];
                    count++;
                }
            }
        }
        return endArray;
    }
  1. 解壓

 public int[][] unCompressArray(int[][] array){
        //初始化壓縮后的數(shù)組
        int x=array[0][0]; //行
        int y=array[0][1];//列
             int[][] endArray=new int[x][y];
        //從1開始遍歷 因為0是首部信息
        for (int i = 1; i <array.length ; i++) {
            int x2=array[i][0]-1; //行號 不過要減一 因為之前為了閱讀方便加了1
            int y2=array[i][1]-1; //列號 不過要減一 因為之前為了閱讀方便加了1
            int num2=array[i][2];
            endArray[x2][y2]=num2;
        }
        return endArray;
    }
  1. 打印

 //打印數(shù)組
    public void printArray(int[][] array){

        for (int[] ax: array) {
            for (int x:ax) {
                System.out.print(x+"\t");
            }
            System.out.println();
        }
    }

最終結(jié)果:


image.png

應(yīng)用場景

對重點數(shù)據(jù)進行記錄
圍棋:表示黑子或白子(表示子較少的比較好)
地圖:在一個坐標(biāo)系中 表示出哪家商戶 xy坐標(biāo)是多少

                                                      *有錯誤歡迎大家指出*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容