1. 程式人生 > 其它 >[java] Trie字首樹

[java] Trie字首樹

技術標籤:java字典樹Trie

定義

又稱單詞查詢樹,字典樹,Trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高

這是一顆儲存了see, pain, pand和dog四個單詞的字首樹

在這裡插入圖片描述
如果不考慮字母的大小寫,那麼Trie字典樹的每個節點都可能有26個子節點。

Trie的常用操作(構造、查詢單詞和查詢字首)

刪除操作用的較少,我就不寫了

構造時每個節點都要加上一個is_word屬性,用於判斷是否為單詞。如文章開頭的定義圖,這棵樹裡面已經有pand這個單詞了,如果使用者去查詢pan這個單詞返回的是false,所以要給每個單詞的結尾設定一個is_word屬性,如果n的is_word為true,那麼就說明樹裡面包含了pan單詞。

程式碼如下:

public class Trie {
    private boolean is_word=false;
    private Trie next[]=new Trie[26];

    public Trie(){}

    public void insert(String word){//插入單詞
        Trie root=this;
        for(char w:word.toCharArray()){
            if(root.next[w-'a']==null)root.next[w-'a']=new Trie();
            root=
root.next[w-'a']; } root.is_word=true; } public boolean search(String word){//查詢單詞 Trie root=this; for(char w:word.toCharArray()){ if(root.next[w-'a']==null)return false; root=root.next[w-'a']; } return root.is_word; }
public boolean startsWith(String prefix){//查詢字首 Trie root=this; for(char w:prefix.toCharArray()){ if(root.next[w-'a']==null)return false; root=root.next[w-'a']; } return true; } }

應用

事實上Trie樹在日常生活中的使用隨處可見。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表高。 Trie的核心思想是空間換時間,適用於大規模的資料。

1、字首匹配

例如:找出一個字串集合中所有以 五分鐘 開頭的字串。我們只需要用所有字串構造一個 trie樹,然後輸出以 五−>分−>鍾 開頭的路徑上的關鍵字即可。 trie樹字首匹配常用於搜尋提示。如當輸入一個網址,可以自動搜尋出可能的選擇。當沒有完全匹配的搜尋結果,可以返回字首最相似的可能

2、字串檢索

給出 N 個單片語成的熟詞表,以及一篇全用小寫英文書寫的文章,按最早出現的順序寫出所有不在熟詞表中的生詞。 檢索/查詢功能是Trie樹最原始的功能。給定一組字串,查詢某個字串是否出現過,思路就是從根節點開始一個一個字元進行比較:如果沿路比較,發現不同的字元,則表示該字串在集合中不存在。如果所有的字元全部比較完並且全部相同,還需判斷最後一個節點的標誌位(標記該節點是否代表一個關鍵字)。