數(shù)據(jù)結(jié)構(gòu)-4.稀疏數(shù)組

1. 當(dāng)一個(gè)數(shù)組中大部分元素為 0,或者為同一個(gè)值時(shí),可以使用稀疏數(shù)組來(lái)保存該數(shù)組

處理方法:

記錄數(shù)組一共有多少行多少列,有多少種不同的值

把有不同值的元素的行列數(shù)及元素的值記錄在一個(gè)小的數(shù)組里,從而縮小程序的規(guī)模,這個(gè)小數(shù)組就是稀疏數(shù)組

這個(gè)數(shù)組可以用稀疏數(shù)組來(lái)表示

這個(gè)原始的二維數(shù)組,一共有 6 * 7 = 42 個(gè)元素

用稀疏數(shù)組來(lái)記錄它

記錄用的稀疏數(shù)組

[0] 元素,記錄了一共有 6 行,7 列,8 個(gè)不同值(不是 0)的元素,之后的每一個(gè)元素,分別記錄每個(gè)不同值元素的行數(shù),列數(shù)和值

稀疏數(shù)組只需要存儲(chǔ) 3 * 9 = 27 個(gè)值

再來(lái)看一個(gè)例子:假如我們需要編寫一個(gè)五子棋,有這樣的棋盤

五子棋的棋盤

使用二維數(shù)組來(lái)記錄它,

用二維數(shù)組來(lái)記錄棋盤,1 表示黑棋,2 表示藍(lán)棋

用稀疏數(shù)組 a 來(lái)表示它 a[0] = {11, 11, 2} a[1] = {2, 1, 1} a[2] = {3, 2, 2}

2. 二維數(shù)組轉(zhuǎn)稀疏數(shù)組的思路:

(1)遍歷原始二維數(shù)組,得到有效數(shù)據(jù)的個(gè)數(shù) sum

(2)用 sum 來(lái)創(chuàng)建稀疏數(shù)組 sparseArray int[sum + 1][3]

(3)將二維數(shù)組的有效數(shù)據(jù)存入到稀疏數(shù)組中

3. 稀疏數(shù)組轉(zhuǎn)二維數(shù)組的思路:

(1)讀取稀疏數(shù)組的第一行, 讀取行數(shù)和列數(shù),創(chuàng)建原始數(shù)組

(2)讀取稀疏數(shù)組后面的數(shù)據(jù),賦值給原始數(shù)組

注意:二維數(shù)組的長(zhǎng)度:

(1)二維數(shù)組是規(guī)則的長(zhǎng)方形或正方形?

int[][] a = new int[11][11]; 它表示聲明了一個(gè)數(shù)組,里面有 11 個(gè)元素,每個(gè)元素是一個(gè)長(zhǎng)度為 11 的整數(shù)數(shù)組,長(zhǎng)度是 11, a.length =? 11

int[][] b = new int[2][12]; 它表示聲明了一個(gè)數(shù)組,里面有 2 個(gè)元素,每一個(gè)元素是一個(gè)長(zhǎng)度為 12 的整數(shù)數(shù)組,長(zhǎng)度是 12,a.length = 12

(2)二維數(shù)組是不規(guī)則的,每一行的元素個(gè)數(shù)不等

int [][] c = new int[3][];

c[0] = new int[] {1,2,3,4};

c[1] = new int[] {2,3,4,5,6,7,8};

c[2] = new int[] {0,0};

此時(shí),c.length = 3,遍歷時(shí)應(yīng)該分著使用 a[0].length,a[1].length,a[2].length

這說(shuō)明,如果行數(shù)和列數(shù)都已經(jīng)定義,二維數(shù)組的長(zhǎng)度為列數(shù),如果只有行數(shù)沒(méi)有列數(shù),二維數(shù)組的長(zhǎng)度為行數(shù)

具體代碼實(shí)現(xiàn):(舉例)

1. 假設(shè)有這樣一個(gè)數(shù)組可以用稀疏數(shù)組來(lái)簡(jiǎn)化表示它

原始的二維數(shù)組
大部分元素都是 0,有幾個(gè)非 0 元素的數(shù)組

2. 將其轉(zhuǎn)化為稀疏數(shù)組,首先遍歷二維數(shù)組,計(jì)算出有多少個(gè)元素是非 0 的

計(jì)算非 0 元素的個(gè)數(shù)

3. 創(chuàng)建稀疏數(shù)組并為其賦值

定義稀疏數(shù)組的大小,并將其第一行的三個(gè)元素賦值,即原數(shù)組的行數(shù),列數(shù),和特值數(shù)

4. 將原數(shù)組轉(zhuǎn)化為稀疏數(shù)組

轉(zhuǎn)化并顯示
轉(zhuǎn)化后的稀疏數(shù)組

5. 可以用 IO流將其輸出到指定位置

使用 StringBuffer 來(lái)將數(shù)組以字符串形式輸出

6. 假如要將某個(gè)文件中存儲(chǔ)的稀疏數(shù)組轉(zhuǎn)化為原始數(shù)組

使用 BufferedReader 的 readLine() 方法來(lái)讀取,更適合一次性讀取稀疏數(shù)組的一整行
流的關(guān)閉

7. 將稀疏數(shù)組轉(zhuǎn)化為二維數(shù)組

通過(guò)稀疏數(shù)組中記錄的行數(shù)和列數(shù)來(lái)創(chuàng)建數(shù)組,再依次為特值賦值

注意:在實(shí)際工作中,通過(guò) IO流讀取稀疏數(shù)組文件,同時(shí)將其之間轉(zhuǎn)化為原數(shù)組更為方便,而這種先讀取為字符串再轉(zhuǎn)化為稀疏數(shù)組再轉(zhuǎn)化為原數(shù)組的方法是非常麻煩的

具體操作如下:

還是使用 BufferedReader 中的 readLine() 方法來(lái)一次性讀取一行,注意在每一行的結(jié)尾處也加入 \t,以方便分割字符串,將所有的數(shù)字(String)放入 String 數(shù)組中,先用前三個(gè)元素來(lái)恢復(fù)創(chuàng)建原數(shù)組,再每三個(gè)一組,恢復(fù)數(shù)組中的特值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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