Java數(shù)據(jù)結(jié)構(gòu)和算法-稀疏數(shù)組

稀疏sparsearray數(shù)組

先看一個(gè)實(shí)際的需求
  • 編寫(xiě)的五子棋程序中,有存盤(pán)退出續(xù)上盤(pán)的功能。

    使用二維數(shù)組記錄棋盤(pán)
0 0 0 0 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 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 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 0
  • 分析問(wèn)題:
    因?yàn)樵摱S數(shù)組的很多值都是默認(rèn)值0,因此記錄了很多沒(méi)有意義的數(shù)據(jù)--->稀疏數(shù)組辐烂。
基本介紹

當(dāng)一個(gè)數(shù)組中大部分元素為0,或者為同一個(gè)值的數(shù)組時(shí),可以使用稀疏數(shù)組來(lái)保存該數(shù)組蚂斤。
稀疏數(shù)組的處理方法是:

  1. 記錄數(shù)組一共有幾行幾列,有多少個(gè)不同的值
  2. 把不同值的元素的行列及值記錄在一個(gè)小規(guī)模的數(shù)組中,從而縮小程序的規(guī)模栓拜。
  • 稀疏數(shù)組舉例說(shuō)明
0   0   0    22  0   0   15
0   11  0    0   0   17  0
0   0   0    -6  0   0   0
0   0   0    0   0   39  0
91  0   0    0   0   0   0
0   0   28   0   0   0   0
行(row) 列(col) 值(value) 備注
[0] 6 7 8 稀疏數(shù)組第一個(gè)下標(biāo)存的是整個(gè)二維數(shù)組的行,列,包括有幾個(gè)非0的值
[1] 0 3 22 稀疏數(shù)組第二個(gè)下標(biāo)存的是二維數(shù)組中的第0行第3列的值(記錄非0的值)
[2] 0 6 15 以此類(lèi)推
[3] 1 1 11 以此類(lèi)推
[4] 1 5 17 以此類(lèi)推
[5] 2 3 -6 以此類(lèi)推
[6] 3 5 39 以此類(lèi)推
[7] 4 0 91 以此類(lèi)推
[8] 5 2 28 以此類(lèi)推
應(yīng)用實(shí)例

二維數(shù)組轉(zhuǎn)稀疏數(shù)組的思路:
1.遍歷原始的二維數(shù)組,得到有效數(shù)據(jù)的個(gè)數(shù)(sum)
2.根據(jù)sum就可以創(chuàng)建稀疏數(shù)組sparseArr int[sum+1][3]
3.將二維數(shù)組的有效數(shù)據(jù)存入到稀疏數(shù)組中

稀疏數(shù)組轉(zhuǎn)原始二維數(shù)組的思路:
1.先讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù),創(chuàng)建原始的二維數(shù)組,比如上面的chessArr2=int[15][15]
2.在讀取稀疏數(shù)組后幾行的數(shù)據(jù),并賦給原始的二維數(shù)組即可

1)使用稀疏數(shù)組,來(lái)保留類(lèi)似前面的二維數(shù)組(棋盤(pán),地圖等等)
2)把稀疏數(shù)組存盤(pán),并且可以重新恢復(fù)原來(lái)的二維數(shù)組
3)代碼實(shí)現(xiàn)

package com.young.sparsearray;

public class SparseArray {

    public static void main(String[] args) {
        //創(chuàng)建一個(gè)原始的二維數(shù)組 15 * 15
        //0: 表示沒(méi)有棋子,1: 表示黑子,2: 表示白子
        int[][] chessArr1 = new int[15][15];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //輸出原始的二維數(shù)組
        System.out.println("原始的二維數(shù)組");
        for (int[] row : chessArr1) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }

        //將二維數(shù)組轉(zhuǎn)稀疏數(shù)組
        //1.先遍歷二維數(shù)組得到非0數(shù)據(jù)的個(gè)數(shù)
        int sum = 0;
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                if (chessArr1[i][j] != 0) {
                    sum++;
                }
            }
        }

        //2.創(chuàng)建對(duì)應(yīng)的稀疏數(shù)組
        int[][] sparseArr = new int[sum + 1][3];
        //給稀疏數(shù)組賦值
        //row col value
        //15  15   2
        sparseArr[0][0] = 15;
        sparseArr[0][1] = 15;
        sparseArr[0][2] = sum;

        //遍歷二維數(shù)組,將非0的值存放到稀疏數(shù)組中
        int count = 0;//count用于幾率是第幾個(gè)非0數(shù)據(jù)
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                if (chessArr1[i][j] != 0) {
                    count++;
                    sparseArr[count][0] = i;
                    sparseArr[count][1] = j;
                    sparseArr[count][2] = chessArr1[i][j];
                }
            }
        }

        //輸出稀疏數(shù)組的形式
        System.out.println();
        System.out.println("得到稀疏數(shù)組為~~~~");
        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();

        /**
         * 將稀疏數(shù)組-->恢復(fù)成原始的二維數(shù)組步驟:
         * 1.先讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù),創(chuàng)建原始的二維數(shù)組,比如上面的chessArr2=int[15][15]
         * 2.在讀取稀疏數(shù)組后幾行的數(shù)據(jù),并賦給原始的二維數(shù)組即可
         */
        //1.先讀取稀疏數(shù)組的第一行,根據(jù)第一行的數(shù)據(jù),創(chuàng)建原始的二維數(shù)組
        int[][] chessArr2 = new int[sparseArr[0][0]][sparseArr[0][1]];

        //2.在讀取稀疏數(shù)組后幾行的數(shù)據(jù)(從第二行開(kāi)始),并賦給原始的二維數(shù)組即可
        for (int i = 1; i < sparseArr.length; i++) {
            chessArr2[sparseArr[i][0]][sparseArr[i][1]] = sparseArr[i][2];
        }

        //輸出恢復(fù)后的二維數(shù)組
        System.out.println();
        System.out.println("恢復(fù)后的二維數(shù)組");
        for (int[] row : chessArr2) {
            for (int data : row) {
                System.out.printf("%d\t", data);
            }
            System.out.println();
        }
    }

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末狼纬,一起剝皮案震驚了整個(gè)濱河市晋柱,隨后出現(xiàn)的幾起案子砸讳,更是在濱河造成了極大的恐慌琢融,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簿寂,死亡現(xiàn)場(chǎng)離奇詭異吏奸,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)陶耍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)奋蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人烈钞,你說(shuō)我怎么就攤上這事泊碑。” “怎么了毯欣?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵馒过,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我酗钞,道長(zhǎng)腹忽,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任砚作,我火速辦了婚禮窘奏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葫录。我一直安慰自己着裹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布米同。 她就那樣靜靜地躺著骇扇,像睡著了一般摔竿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上少孝,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天继低,我揣著相機(jī)與錄音,去河邊找鬼稍走。 笑死郁季,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钱磅。 我是一名探鬼主播梦裂,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盖淡!你這毒婦竟也來(lái)了年柠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褪迟,失蹤者是張志新(化名)和其女友劉穎冗恨,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體味赃,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掀抹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了心俗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傲武。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖城榛,靈堂內(nèi)的尸體忽然破棺而出揪利,到底是詐尸還是另有隱情,我是刑警寧澤狠持,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布疟位,位于F島的核電站,受9級(jí)特大地震影響喘垂,放射性物質(zhì)發(fā)生泄漏甜刻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一正勒、第九天 我趴在偏房一處隱蔽的房頂上張望得院。 院中可真熱鬧,春花似錦昭齐、人聲如沸尿招。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)就谜。三九已至,卻和暖如春里覆,著一層夾襖步出監(jiān)牢的瞬間丧荐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工喧枷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虹统,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓隧甚,卻偏偏與公主長(zhǎng)得像车荔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子戚扳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容