雙陣列TRIE樹Double-Array Trie理解引導
啟文
很難懂很難懂
不知道什麼時候開始,看別人的寫的東西都看不懂了,不知道是自己思維出現問題,還是別人的表達確實存在歧義。一個點存在一個歧義,兩個點歧義就變成4種理解,3點、4點還得了。一點存在歧義就沒得辦法看懂。
double Array trie的實現不過很多年沒更新,似乎都不能下載了,裡面談到幾次論文更新:
- Tripple-Array Trie
- Double-Array Trie
- Suffix Compression-> double-array branches and suffix-spool tail
- Double-Array Pool Allocation->G-link
換句話說效果比較好的就是這個DATrie的G-link方法,效果更好的裡面沒提起,不解釋了。
https://linux.thai.net/~thep/datrie/datrie.html這裡面介紹了double-array-trie的方法演進,很久沒更新了不知道有新的改進沒。
https://zhuanlan.zhihu.com/p/185832624這裡漢語版理解double-array-trie的過程,百度百科不用看了看不懂的,就看他的吧!
https://blog.csdn.net/zzran/article/details/8462002 是前面的第3點改進double-array-trie的做法,就是字尾
G-link還沒理解
先理解double-array-trie計算過程,只是計算過程看通了,原理沒懂,還得繼續瞭解。
先構建
詞集:【a,ab,bbc,bc】
根據詞集生成語料:
字符集:【a,b,c】
狀態集:【a,ab,b,bb,bc,bbc】
計算流程是這樣的(python的格式,雖然是兩陣列其實還有其他變數參與):
初始化:
字符集建立字典:index={a:1,b:2,c:3} #舉例index[c]=3
狀態集也建立字典:state={none:0,a:none,ab:none,b:none,bb:none,bc:none,bbc:none} #none是空,這個字典記錄的狀態的過程狀態值,起始時除了none鍵,其它沒定義值;
定義陣列:base=[0,none,none,none,none,none,none,none] #總共8個元素為啥?比狀態多吧
定義陣列:check=[none,none,none,none,none,none,none,none] #個數和base一樣
`base`是字串去掉最後一個字元剩下的字串。
建立公式如下:
- 初始化
- 計算字串a
- 計算字串ab
- 計算字串bbc
bbc經過反推,bbc沒有bb的`base`,再推沒有b的`base`,所以要從b開始建立陣列值。
計算字串b
計算字串bb
計算字串bbc
- 計算字串bc
到此為止構建完成了,構建過程很容易理解,為什麼這麼構建?還要進一步分析。
查詢
驗證公式如下
查詢ab
先查a再查詢ab
ab配對成功。
接下來匹配abc,上接ab查詢:
匹配失敗。
結語
state中的值不能重複,其值對應base陣列中的索引,理解為“佔索引”,base陣列和check陣列的索引是一一對應的。
trie數對英文特別好,因為英文就26個字母,漢字就不同了幾千到幾萬個常用字元,所以用double-array trie,構建後查詢特別快。還必須瞭解的FST共享字首樹,這是lucene用的結構需要了解一下。
這些結構涉及到前沿技術,必須懂!
另:1)前面的計算過程是仿照前面給出的連線中的文章演示翻譯出來的還沒進行驗證;2)這個計算過程為什麼這麼計算還沒弄透,搞透後更新這篇部落格。
後面更新這兩點,或者理解的朋友留言告知,你不說我不說,就沒有網際網路共享的知識,分享還能幫助記憶嗎沒錯吧。
相關文章
- 雙陣列字典樹(Double Array Trie)陣列
- 雙陣列Trie樹高效構建有向無環圖陣列
- Java雙陣列Trie樹的實現方案總結Java陣列
- hihocoder 1014 Trie樹 (Trie 記模板 陣列+指標)陣列指標
- 【動畫】看動畫輕鬆理解「Trie樹」動畫
- hihocoder trie 樹
- 由簡入繁--Trie樹實戰
- Trie樹:字串頻率統計排序字串排序
- Trie樹【P3879】 [TJOI2010]閱讀理解
- 字串演算法--$\mathcal{KMP,Trie}$樹字串演算法KMP
- [翻譯]資料結構——trie樹介紹資料結構
- Trie tree實踐
- 可持久化trie持久化
- hihocoder 1261 String Problem II (Trie樹)
- 看圖輕鬆理解資料結構與演算法系列(Trie樹)資料結構演算法
- 可持久化 01 trie持久化
- LeetCode 1032. Stream of Characters 4行Trie樹LeetCode
- AC自動機+trie樹實現高效多模式匹配字典模式
- hihocoder 1260 String Problem I (Trie樹 好題)
- 一個簡單的統計問題(解決方案:Trie樹)
- 基於PHP + TRIE樹實現敏感詞過濾演算法PHP演算法
- 怎樣實現基於Trie樹和字典的分詞功能分詞
- 【資料結構與演算法】Trie(字首樹)模板和例題資料結構演算法
- poj 3764 最長異或路徑(二進位制trie樹)
- 異或之Kth[1] (可持久化二進位制trie樹)持久化
- LeetCode- Implement Trie (Prefix Tree)LeetCode
- [leetcode/lintcode 題解] 微軟 面試題:實現 Trie(字首樹)LeetCode微軟面試題
- POJ 2513-Colored Sticks(連線木棍-trie樹+並查集+尤拉通路)並查集
- Hadoop TeraSort演算法之2-trie樹構造時間解惑Hadoop演算法
- 淺談樹形結構的特性和應用(上):多叉樹,紅黑樹,堆,Trie樹,B樹,B+樹...
- 複習(二):KMP、Trie、最大異或對、KMP
- bzoj 4546: codechef XRQRS [可持久化Trie]持久化
- HDU 5536 Chip Factory (暴力 或者 01Trie)
- Trie|如何用字典樹實現搜尋引擎的關鍵詞提示功能
- 【資料結構和演算法】Trie樹簡介及應用詳解資料結構演算法
- 【Tire 求字典出現的字首個數】hihocoder 1014 Trie樹
- 支援中文的基於詞為基本粒度的字首樹(prefix trie)python實現Python
- bzoj4260: Codechef REBXOR(01Trie)