當乙個陣列中的資料大部分都是預設資料,此時陣列資料需要存檔的情況下,大量預設資料也會占用儲存空間。稀疏陣列正是用於解決此類問題,稀疏陣列只存在資料在原始陣列中的位置及值,在存檔時只報存稀疏陣列中的資料即可;當讀取檔案時根據稀疏陣列來還原 原始陣列。
作用:減少儲存空間,起到類似資料壓縮的作用。
下面就來使用乙個簡單案例介紹一下稀疏陣列的使用
問題引出:
下面介紹乙個遊戲-五子棋,大家都知道棋盤是乙個縱橫交錯的線劃分而成的,其實轉變一下就變成了程式設計中的二維陣列,每個點都是陣列中的乙個座標,下就來代入一下
* 二維陣列模擬五子棋棋盤
*1:白子;2:黑子
* 棋盤效果模擬圖如下:
*000
0000
0000
*001
0000
0000
*000
2000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
*000
0000
0000
//1.定義行列的長度
val rowsize =
11 val colsize =
11//2.定義二維陣列
val array = array.ofdim[int]
(rowsize, colsize)
array(1
)(2)
=1array(2
)(3)
=2
問題:如下棋盤是乙個二維陣列儲存資料,假設此時棋手需要暫存遊戲下次繼續玩,而此時棋盤上面棋子並不多,如果對整個陣列中資料進行存檔則預設無子也會占用空間。
解決:在棋子不多的情況下,使用稀疏陣列來記錄每個棋子的橫縱座標以及棋子型別即可,在實際存檔時只需要儲存這些已經落下的棋子即可
//記錄乙個棋子資料,行-列-值
class
node
(val row: int, val col: int, val value: int)
下面使用完整**演示:
object sparsearr }}
//5. 檔案io操作
val datas =
showsparsearr
(sparsearr)
//顯示稀疏陣列結果
//落地為磁碟檔案
val filename =
"d:/1.txt"
fileutil.
write
(filename)
(datas)
println
("------------檔案讀取----------"
)//檔案資料載入
val nodes = fileutil.
read
(filename)
nodes.
foreach
(println
(_))
println
("------------稀疏陣列還原棋盤----------"
)//6.根據檔案讀取資料,還原完整棋盤
val ar2 = array.ofdim[int]
(rowsize, colsize)
for(i <
-1 until nodes.length)
for(items <
- ar2)
println()
}}//棋盤顯示函式
def showqipan
(array: array[array[int]])
: unit =
println()
}}def showsparsearr
(arr: arraybuffer[node])=
strs.toarray
}}//記錄乙個棋子資料,行-列-值
class
node
(val row: int, val col: int, val value: int)
終結:當陣列中資料大量是預設資料時需要存檔,則可以使用稀疏資料完成資料壓縮作用 sgu 101 Domino 解題報告及測試資料
101.domino time limit per test 0.25 sec.memory limit per test 4096 kb 題解 求多公尺諾骨牌按照一定方式放置能否使相鄰的位置數字相同。其實就是求無向圖的尤拉通路,dfs即可。但需要注意以下幾點 1 注意是否是連通圖。2 注意自環。3...
c51隨機數不重複 scala生成隨機數注意
又是乙個採坑之旅。scala的運算元分為兩類,transformer運算元和action運算元。由於scala是惰性的,在transformer運算元執行時,只是記錄這個操作,而並沒有真正的執行,只有遇到action運算元,才會將之前的所有操作真正執行。因此,當在transformer之後,多次進行...
例題10 1 巨大的斐波拉契數 Uva 11582
題意 讓你求斐波拉契數列的第a的b次方項模n的結果。分析 由於是每一項都對n取模,所以不同的n值都會對應乙個週期,只要迴圈一下。當前項等於f1,前一項等於f0時就可以跳出迴圈了。a的b次方,可以用冪取模的知識,快速分治求出。注意第二個樣例a要先模一下週期,不然會有溢位。剛開是long long 也會...