Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。 典型應用是用於統計和排序大量的字符串(但不僅限於字符串), 所以經常被搜索引擎系統用於文本詞頻統計。
字典樹(Trie)可以保存一些字符串->值的對應關系。基本上,它跟 Java 的 HashMap 功能相同,都是 key-value 映射,只不過 Trie 的 key 只能是字符串。
Trie 的強大之處就在於它的時間復雜度。它的插入和查詢時間復雜度都為 O(k) ,其中 k 為 key 的長度,與 Trie 中保存了多少個元素無關。Hash 表號稱是 O(1) 的,但在計算 hash 的時候就肯定會是 O(k) ,而且還有碰撞之類的問題;Trie 的缺點是空間消耗很高。
Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計和排序大量的字符串(但不僅限於字符串),所以經常被搜索引擎系統用於文本詞頻統計。它的優點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。
Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。
優點
利用字符串的公共前綴來節約存儲空間,最大限度的減少無謂的字符串比較,查詢效率比哈希表高。
比如說我們想儲存3個單詞,sky、skyline、skymoon。如果只是單純的按照以前的字符數組存儲的思路來存儲的話,那么我們需要定義三個字符串數組。但是如果我們用字典樹的話,只需要定義一個樹就可以了。在這里我們就可以看到字典樹的優勢了。
基本性質
- 根節點不包含字符;
- 除根節點外每一個節點都只包含一個字符:
- 從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串,每個節點的所有子節點包含的字符都不相同
假如我們有and,as,at,cn,com這些關鍵詞,那么如何構建trie樹呢?
使用范圍
既然學Trie樹,我們肯定要知道這玩意是用來干嘛的。
第一:詞頻統計
可能有人要說了,詞頻統計簡單啊,一個hash或者一個堆就可以打完收工,但問題來了,如果內存有限呢?還能這么玩嗎?所以這里我們就可以用trie樹來壓縮下空間,因為公共前綴都是用一個節點保存的。
如果在trie樹的node節點添加新的域 count,記錄已有的單詞總數。那么,Trie樹除了實現單詞查詢之外,還可以實現單詞頻度統計。
如我們定義的Trie樹的節點結構如下:
請參見:http://blog.csdn.net/ohmygirl/article/details/7953814
第二: 前綴匹配
就拿上面的圖來說吧,如果我想獲取所有以"a"開頭的字符串,從圖中可以很明顯的看到是:and,as,at,如果不用trie樹,你該怎么做呢?很顯然朴素的做法時間復雜度為O(N2) ,那么用Trie樹就不一樣了,它可以做到h,h為你檢索單詞的長度,可以說這是秒殺的效果。
舉個例子:現有一個編號為1的字符串”and“,我們要插入到trie樹中,采用動態規划的思想,將編號”1“計入到每個途徑的節點中,那么以后我們要找”a“,”an“,”and"為前綴的字符串的編號將會輕而易舉。
關於Tire樹的更多介紹請參見:http://www.cnblogs.com/jiutianhe/archive/2012/10/16/2755650.html
http://www.blogchong.com/?mod=pad&act=view&id=86