SparseArray(稀疏陣列)的介紹和應用

2021-10-02 02:17:02 字數 3111 閱讀 2953

稀疏陣列概念和特點介紹

sparse 翻譯過來是稀疏、缺少的意思,sparsearray是稀疏的陣列。它應用場景是相對稀少的資料,一般是幾百以內的資料效能相對 hashmap 要好,大概提公升 0-50% 的效能。sparsearray 是用 integer 作為鍵對映物件。

sparsearray 不需要對 key 和 value 進行 auto-boxing(自動裝箱),將原始型別封裝為物件型別,比如把 int 型別封裝成 integer 型別。

插入 10w 條資料的儲存使用 ddms 檢視,hashmap 的儲存空間 14m 左右,而sparsearray 只有 8m 左右,少了近 40% 的記憶體。sparsearray 正序插入效率比起倒序插入快了幾乎是 10 倍。

如果是按照 1、3、2 的順序排列進行插入,但是在 sparsearray 內部會按照正序進行重新排列,這時因為 sparsearray 在檢索資料的時候使用的是二分查詢(二分法必須是有序),所以每次插入新資料的時候 sparsearray 都需要重新排序,逆序是最差情況。

五子棋遊戲

以上的概念介紹,看看就好了,網上都有,所以就不再多說的。

參考如下,可以自行看看:

接下來,我講講我的理解。我直接從乙個案例來分析,這個案例其實我們都有玩過,它是乙個五子棋遊戲,五子棋玩法挺簡單的,其中有這樣乙個應用場景。比如,我需要將棋盤上的白子和黑子給儲存起來,因為玩家可能要存檔

存檔呢,意味著要存入本地,那麼如何將棋盤上的棋子儲存起來,想必大家可能會想到一種最直接的方法,就是使用二維陣列

比如,這是乙個 6 * 5 的棋盤

我們用二維陣列來儲存的話,就應該是這樣的

// 6*5 的二維陣列

private

static

int[

] array =

newint

,,,,,}

;

引出的問題

可以看到,這個二維陣列,其實沒多大問題。可是如果要進行儲存的話,那陣列中絕大部分元素的值是 0 的,幾乎沒有意義。真正的有效值,只有 3 和 7,就代表圖上的棋子座標

如果將這樣乙個二維陣列存到磁碟或者記憶體中時,它占用的記憶體空間是 6 * 5 * int 個位元組。

sparsearray(稀疏陣列)原理介紹

sparsearray 的原理:將陣列中大部分為 0 或者是同乙個值的的元素儲存起來,第一行存放二維陣列的行 和 列 以及元素有效值個數,用 行列 來標記不同與其它的元素值和它的位置。

稀疏陣列有乙個特點,那就是它的列是固定的,只有 3 列,行數 = 有效值的數量 + 1,因為第 0 行用於儲存二維陣列資訊。

所以呢,它就會將棋盤的二維陣列,轉為如下的樣子

這樣的話,從剛剛的 6 * 5 的陣列,一下子變成了 3 * 3 的陣列,占用的記憶體顯然更加低了。

二維陣列 —> 稀疏陣列

其實,如果我們知道了稀疏陣列是什麼原理,它是如何將二維陣列轉換的話,那麼在**方面,應該問題不大。以下是我寫的乙個二維陣列轉稀疏陣列的**:

/**

* 二維陣列 -> 稀疏陣列

* @param arrs

*/public

static

void

arraytosparsearray

(int

arrs)}}

int sprow = valcount +1;

// 行數 = 有效值 + 1

int[

] sparray =

newint

[sprow][3

];// 設定稀疏陣列第 0 行的值

sparray[0]

[0]= row;

sparray[0]

[1]= col;

sparray[0]

[2]= valcount;

// 為稀疏陣列賦值

for(

int i =

0; i < valcount; i++

) system.out.

println

("********************====");

printarray

(sparray)

; system.out.

println

("********************====");

sparsearraytoarray

(sparray)

;}

稀疏陣列 —> 二維陣列

稀疏陣列轉二維陣列也同理,轉換思路反過來就行

/**

* 稀疏陣列 -> 二維陣列

* @param arrs

*/public

static

void

sparsearraytoarray

(int

arrs)

// 初始化乙個預設為 0 的二維陣列

int[

] array =

newint

[row]

[col]

;for

(int i =

0; i < row; i++)}

// 為二維陣列設定有效值

for(

int i =

0; i < valcount; i++

)printarray

(array)

;}

列印陣列中的元素:

public

static

void

printarray

(int

arrs)

}}

**就不做過多的解釋了,比較簡單易懂。

稀疏sparsearray陣列

將二維陣列轉成稀疏陣列 1.先遍歷二維陣列 得到非0資料的個數 int sum 0 for int i 0 i 11 i system.out.println sum sum 建立對應的稀疏陣列 int sparsearr new int sum 1 3 給稀疏陣列賦值 sparsearr 0 0 ...

稀疏sparsearray陣列

線性結構常見的有 陣列 佇列 鍊錶和棧 非線性結構包括 二維陣列 多維陣列 廣義表 樹結構 圖結構 編寫的五子棋程式中,有存檔退出和續上盤的功能 分析問題 因為該二維陣列的很多值是預設值 0,因此記錄了很多沒有意義的資料 稀疏陣列。當乙個陣列中大部分元素為 或者為同乙個值的陣列時,可以使用稀疏陣列來...

關於sparseArray稀疏陣列

關於稀疏陣列 二維陣列 轉 稀疏陣列的思路 遍歷 原始的二維陣列,得到有效資料的個數 sum 根據sum 就可以建立 稀疏陣列 sparsearr int sum 1 3 將二維陣列的有效資料資料存入到 稀疏陣列 稀疏陣列轉原始的二維陣列的思路 先讀取稀疏陣列的第一行,根據第一行的資料,建立原始的二...