双数组 实现 Trie
生活随笔
收集整理的這篇文章主要介紹了
双数组 实现 Trie
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
NewSMTH
zhjin (sweptAway): 在開發中文分詞器的時候, 一個高效的詞典結構尤其重要。 詞典的一種常見高效的實現方式就是使用 Trie 結構, 但是傳統的 Trie
結構的實現方式復雜, 也比較浪費內存。 雙數組 是目前 Trie 結構
中的一種高效的實現方式, 檢索速度快, 也比較節約內存。 這里簡
要介紹兩個比較實用的雙數組實現
1. Darts (http://chasen.org/~taku/software/darts/)
Darts(Double-ARray Trie System) 是日本的 Taku kudo (也是 CRF++
的作者) 實現的一個雙數組, 接口簡單,只提供了一個約 500 行代碼
的頭文件 darts.h, 實現的邏輯也相對簡單, 如果了解雙數組的原理
的話,要讀懂代碼并不難。目前兩個著名的開源日文分詞系統 Mecab,
Chasen 都使用 Darts 構建詞典, 檢索速度快, 但是有點浪費內存。
Darts 的接口文檔是日文的, 我把它的主要接口翻譯成了中文,
可以參看我博客上的如下鏈接
http://zhjin.spaces.live.com/blog/cns!2FEA4AA78B600980!692.entry?&_c02_vws=1
2. Darts-clone (http://code.google.com/p/darts-clone/)
另外一個日本人 Susumu Yata 開發的一個雙數組實現, 接口完全兼容
Darts, 因此叫做 Darts-clone, 實現算法可以參看論文
Yata, S.; Oono, M.; Morita, K.; Fuketa, M.; Sumitomo, T. & Aoe, J.
A compact static double-array keeping character codes.
Information Processing and Management, Vol. 43, No. 1, pp. 237-247, 2007.
從論文的署名順利來看, 該作者應該是雙數組的發明者 Junichi Aoe
的學生。 在 Darts 中, 雙數組的每個節點要由 base 和 check 兩個
32bit 整數來表示, Susumu Yata 的論文中給出了只用一個 32bit 整
數來同時表示 base 和 check
的簡單方法, 同時又對只有單個分支的節點進行壓縮,因此Darts-clone
相比于 Darts大大節約了內存。 另外, Darts-clone 在實現的時候把雙
數組中的加法操作巧妙替換為位運算, 因此檢索速度上也要比 Darts 稍
快一些。
有興趣的讀者可以參看 http://code.google.com/p/darts-clone/w/list
中給出的 Darts & Darts-clone 的性能對比。作者給了 Darts-clone 的兩個
實現
Darts clone 0.32f 內存消耗為 Darts 的 1/2, 速度比 Darts 快
Darts clone 0.32e 內存消耗為 Darts 的 1/4, 速度比 Darts 慢
當然以上為粗略結果, 性能表現在不同數據集上略有差異��boycat (記得請冬子打球|我是鄉下人,小地方來的): 贊~~~
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在開發中文分詞器的時候, 一個高效的詞典結構尤其重要。 詞典
: 的一種常見高效的實現方式就是使用 Trie 結構, 但是傳統的 Trie
: 結構的實現方式復雜, 也比較浪費內存。 雙數組 是目前 Trie 結構
: ...................jiju (Super.Jiju): zan
【 在 zhjin (sweptAway) 的大作中提到: 】
: 在開發中文分詞器的時候, 一個高效的詞典結構尤其重要。 詞典
: 的一種常見高效的實現方式就是使用 Trie 結構, 但是傳統的 Trie
: 結構的實現方式復雜, 也比較浪費內存。 雙數組 是目前 Trie 結構
總結
以上是生活随笔為你收集整理的双数组 实现 Trie的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NSLocalizedString 实现
- 下一篇: 活动安排问题--贪心算法