朱迪矩陣

朱迪矩陣Judy array)是一個計算機科學和軟件工程學中的名詞,是一種高性能、低內存消耗的數據結構,實現了關聯數組的功能。與普通數組不同,Judy array可以是稀疏的,這一點更像是散列表,而非數組。Judy array可以用整形或字符串作為鍵值來存儲、查詢數據,它最大的優勢是可動態自動擴展,高性能,節省內存並且易於使用。

由於Judy array在操作速度和內存使用上都非常高效,同時並不需要特殊配置或初始化,使得它可以用來替換掉多種常見數據結構,例如跳躍列表,鍊表,二叉樹,B樹,散列表,而且judy array在海量數據集上的表現比那些數據結構更好。

粗略地講,Judy array像是一個高度優化了的256叉樹,為了節省內存,它使用了超過20種不同的壓縮技術來壓縮樹節點。.[1]

Judy array 是Douglas Baskins發明的,他用自己妹妹的名字命名了這種數據結構。[2]

術語

容量、用量、密度 這三個概念是傳統樹形結構中很少使用,但在Judy array中反覆使用的。 這個的概念的定義如下:

  1. 容量 可以理解為Judy Array在不擴展內存使用的情況下所能維護的數據量,也可以是某個節點的,視乎上下文。
  2. 用量 已經存儲的數據量,既可以描述整個Judy Array的數據量,也可以是某個節點下的。
  3. 密度 用來描述數據存儲的密集程度, 密度 = 用量/容量

優勢

內存分配

Judy array是沒有容量限制的,所以也不用事先分配好存儲空間,它可以根據用量動態決定生長或收縮內存使用,來支撐海量數據存儲。其存儲能力僅受到計算機內存容量的限制。[3] Judy array的內存用量與其存儲的數據用量基本呈線性關係。

速度

Judy array在設計上就力爭保持儘可能高的CPU緩存命中率,為了達到這個目標,其內部算法十分複雜。由於有了這些針對性的優化,使得Judy array在運行速度上十分高效,有時甚至超過散列表,尤其是在處理大數據集的時候。由於Judy array是依託樹 (數據結構)形結構設計的,其內存消耗比散列表小很多,同樣是拜樹形結構所賜,使得它可以完成鍵值的順序遍歷,這一點在散列表中是不可能的。

算法

從Judy array的發明者所撰寫的簡介以及其他一些相關的中文論文中看,設計中使用了多種的壓縮思想與壓縮算法,根據不同的密度情況,選擇不同的壓縮方式,以期儘可能節省內存,降低實際存儲中的稀疏情況,我猜測,這能夠在緩存命中率上帶來不少提升,進而提升效率。

看到的算法思路包括:

  • 對於密度很高,空洞很少的節點,使用位圖(bitmap)來存儲。
  • 對於密度很低的情況,只存儲出現的鍵值
  • 對於密度極低的情況,使用類似於字典樹的結構,跨層壓縮數據。

參考文獻

  1. ^ Alan Silverstein, "Judy IV Shop Manual頁面存檔備份,存於網際網路檔案館)", 2002
  2. ^ 存档副本. [2013-01-07]. (原始內容存檔於2013-01-06). 
  3. ^ Advances in databases: concepts, systems and applications : By Kotagiri Ramamohanarao

外部連結