Wikipedia中「Trie」條目的翻譯(部分)

原文:http://en.wikipedia.org/wiki/Trie算法

相對於其餘搜索算法的優點

不像其餘算法,Trie樹有着一個特別的性質:對於插入、刪除以及查找操做,其代碼路徑,也即運行所需的時間,幾乎都是相同的。所以,在這三種操做的效率都要兼顧的狀況下,Trie樹能夠很是輕易地擊敗二叉查找樹(BST)。同時Trie樹爲 CPU指令和代碼分支緩存預測提供了一個更好的基礎。
數組

如下是Trie樹相對於BST的主要優勢:緩存

  • 能夠更快地查找關鍵字。查找一個長度爲m的關鍵字在最壞狀況下須要O(m)的時間。而BST須要執行O(logn)次關鍵字比較,其中n是樹中結點的數目。這是由於BST的查找依賴於樹的深度,而深度在樹是平衡的狀況下又是結點數目的對數。所以,最壞狀況下,BST須要O(mlogn)數量的時間來完成查找。更壞的是,此時logn會接近m。同時,Trie樹在查找中使用的諸如使用字符來索引數組之類的簡單操做在實際機器上執行會很是快。數據結構

  • 當Trie樹包含許多短的關鍵字,由於結點在有着公共前綴的關鍵字之間共享,Trie樹能夠更爲有效地使用內存空間。函數

  • Trie樹使得最長前綴匹配變得很是容易。spa

  • 從樹根到葉子的路徑上經歷的內部結點的數目等於關鍵字的長度。毫無疑問,Trie樹是平衡的。排序

如下是Trie樹相對於散列表的主要優勢:索引

  • Trie樹支持有序遍歷,而遍歷一個散列表會使用一個由其散列函數給出的僞隨機的序列(更進一步,會被散列衝突的順序所影響,而這是由散列表的實現決定的)。ip

  • Trie樹使得最長前綴匹配變得很是容易。可是基於上面的緣由,散列表沒法作到這一點。執行一個「最近匹配」查找能夠像精確查找同樣快,固然,這也依賴於具體實現。內存

  • 平均意義上,Trie樹在插入上會比散列表快。這是由於散列表在快滿的時候須要重建它的索引,而這是一個很是昂貴的操做。所以Trie樹有着更緊湊的最壞時間界,這對於插入操做時間敏感的程序是很是重要的。

  • 由於不須要使用散列函數,對於短鍵值,Trie樹每每要比散列表快。

應用

代替其餘數據結構

如上所述,Trie樹相對於BST有着許多優點。同時,由於相對於散列表有着如下優點,Trie樹也會被用做替代品:

  • 相對於一個實現得不那麼好的「非完美散列表」,在Trie樹中查找數據最壞狀況下要更快,爲O(m)。「非完美散列表」會出現鍵衝突。一個鍵衝突是指散列函數將不一樣的關鍵字映射到了散列表中相同的位置。最壞狀況下「非完美散列表」查找鍵值的時間複雜度是O(N),但這遠不是平均狀況,平均是O(1),主要是須要O(m)的時間來計算散列值。

  • 對於不一樣的關鍵字,Trie樹不會出現衝突。

  • 對於Trie樹而言,只有在一個鍵關聯多個值的時候,相似於散列表中用於解決鍵衝突的「桶」纔是須要的。

  • 沒有必要提供一個散列函數或者更改所用的散列函數以適應愈來愈多的關鍵字被加到Trie樹中。

  • Trie樹能夠提供一個其中全部條目根據關鍵字、符合字母表順序的序列。

Trie樹也有一些缺點:

  • Trie樹在某些狀況下查找數據時也會比散列表慢,尤爲是數據時須要直接存取硬盤驅動器或者其餘相對於主存而言隨機存取時間很是長的第二存儲設備。

  • 有些鍵值,例如浮點數,會帶有不是那麼有意義的長前綴。可是,一個位Trie樹(bitwise trie)仍然可以處理標準的IEEE單精度和雙精度浮點數。

字典表示

Trie 樹的一個常見應用是儲存一個字典。這樣的應用充分利用了Trie樹可以快速搜索、插入、刪除條目的優點。然而,假如僅僅須要存儲字典的單詞,而單詞附帶的 其餘信息不是必須的,那麼一個最小循環肯定有限自動機會比Trie樹使用更少的空間。這是由於後者可以剪去Trie樹中有着相同後綴(或者其餘部分)的單 詞之間相同部分所對應的「樹枝」。

Trie樹也很是適合用於實現模糊匹配,包括那些用於拼寫檢查和斷字的軟件。

排序

對一個關鍵字集執行字典排序能夠經過下面這個簡單的基於Trie樹的算法來完成:

  1. 將全部關鍵字插入到一個Trie樹中;

  2. 使用先根遍歷輸出Trie樹中全部關鍵字,結果就是按照字典升序排列的結果。先根遍歷是一種深度優先遍歷,而中根遍歷是另一種深度優先遍歷,不事後者更適合用於BST而不是Trie樹。

這個算法是一種基數排序。

Trie樹是Burstsort的基本數據結構,當前已知最快的基於內存/緩存的字符串比較算法。

全文搜索

一種特別的Trie樹,被稱做後綴樹(suffix tree),能夠用來索引一塊文本中的全部後綴以實現快速全文查找。

相關文章
相關標籤/搜索