Double Array Trie快速入門

2021-09-08 20:44:14 字數 1390 閱讀 3623

shiqi.cui

may 24, 2009

trie是一種搜尋樹,因「retrieval」而得名。在以trie樹組織的詞典裡,所有詞條的公共字首是壓縮儲存的,即只會儲存乙份,所以又稱字首樹。如圖所示:

trie可以理解為確定有限狀態自動機,即dfa。在trie樹中,每個節點表示乙個狀態,每條邊表示乙個字元,從根節點到葉子節點經過的邊即表示乙個詞條。查詢乙個詞條最多耗費的時間只受詞條長度影響,因此trie的查詢效能是很高的,跟雜湊演算法的效能相當。

trie可以按照樹的方式儲存。每個節點包含n個指標,分別指向n個後續節點,每條邊對應著乙個輸入字元。這樣,每個節點的指標個數是跟字元表的大小相關的。如果按照鍊錶的方式組織n個指標,查詢的效率會比較低;如果以定長陣列表示n個指標,占用的空間會比較大,基本是不可接受的。

trie也可以按照dfa的方式儲存,即表示為轉移矩陣。行表示狀態,列表示輸入字元,(行, 列)位置表示轉移狀態。這種方式的查詢效率很高,但由於稀疏的現象嚴重,空間利用效率很低。也可以採用壓縮的儲存方式即鍊錶來表示狀態轉移,但查詢效率無法滿足要求。

為了解決上面的問題,有學者依次設計出了four-array trie,triple-array trie和double-array trie結構,其得名源於內部採用的陣列的個數。

double-array trie包含base和check兩個陣列。base陣列的每個元素表示乙個trie節點,即乙個狀態;check陣列表示某個狀態的前驅狀態。

base和check的關係滿足下述條件:

base[s] + c = t

check[t] = s

其中,s是當前狀態的下標,t是轉移狀態的下標,c是輸入字元的數值。如圖所示:

根據上述公式,查詢某個字串就非常簡單。

假設初始狀態為t0,字串行是(c1, c2, …, cn)。那麼,輸入c1後的狀態為t1 = base[t0] + c1,以此類推。

如果到某個狀態是不合法的,那麼查詢失敗;如果轉到狀態tn = base[tn-1] + c,並且tn是結束狀態,那麼查詢成功;如果tn不是結束狀態,那麼查詢失敗。

首先,初始化base和check陣列,元素預設值是0。隨機確定初始狀態t0及其base值,如t0=0, base[t0]=1。

對於插入詞條,計算輸入每個字元後的base位置。

如果該位置為空,則表示該位置可以插入,然後轉到下乙個字元;

如果該位置已有值,表示該位已經被其他的狀態占用,這樣需要調整其前驅狀態的base值,以保證狀態不會衝突,這個過程稱為relocate。

1.

Boost Graph Library 快速入門

boost graph library 快速入門 by 燕飛龍 南亮亮 採用boost中的鄰接鍊錶 adjacency list 實現圖的定義 下面是乙個鄰接鍊錶定義的例子 include 首先定義圖中節點和邊的屬性 struct vertexproperty structedgeproperty ...

Expression Blend 介面快速入門

在開始使用blend前,首先需要進行silverlight的開發環境搭建,在銀光中國網 silverlightchina.net 有篇 輕鬆建立silverlight開發環境 其中列出了建立silverlight開發環境的幾個步驟,另外,我在過去發布過一篇 silverlight開發工具集合 文章,...

tmux命令啟動MySQL tmux 快速入門

為什麼要用 tmux 如果你對 tmux 的疑問還停留在 我可以開多個 terminal 的 tab 啊,為什麼要用 tmux 呢?那我只能呵呵了。tmux 的強大之處在於 可以連線本地或遠端的 sessions 強大的 window 和 pane 管理 在不同的 session 之間移動 wind...