簡介
字典樹:又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。
優點:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。
性質: 1. 根節點不包含字元,除根節點外每乙個節點都只包含乙個字元;
2. 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串;
3. 每個節點的所有子節點包含的字元都不相同。
應用場景:用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。
**
實現
是否是單詞 (boolean isword)
節點所有的子節點,用map來儲存 (map next)
新增
public查詢trie查詢操作就比較簡單了,遍歷帶查詢的字串的字元,如果每個節點都存在,並且待查詢字串的最後乙個字元對應的node的isword屬性為true,則表示該單詞存在void
add(string word)
current =current.next.get(c);
}//current就是word的最後乙個字元的node
//如果當前的node已經是乙個word,則不需要新增
if (!current.isword)
}
public字首查詢boolean
contains(string word)
current =node;
}//current就是word的最後乙個字元的node
return
current.isword;
}
public刪除trie的刪除操作就稍微複雜一些,主要分為以下3種情況:boolean
containsprefix(string prefix)
current =node;
}return
true
;}
1. 如果單詞是另乙個單詞的字首
如果待刪除的單詞是另乙個單詞的字首,只需要把該單詞的最後乙個節點的 isword 的改成false,
比如trie中存在 panda 和 pan 這兩個單詞,刪除 pan ,只需要把字元 n 對應的節點的 isword 改成 false 即可。
2. 如果單詞的所有字母的都無分支,刪除整個單詞。
如果單詞的所有字母的都沒有多個分支(也就是說該單詞所有的字元對應的node都只有乙個子節點),則刪除整個單詞。
3. 如果單詞的除了最後乙個字母,其他的字母有多個分支
//當前節點的子節點大於1個
if (child.next.size() > 1)
current =child;
}//如果單詞後面還有子節點
if (current.next.size() > 0)
//不存在該單詞,該單詞只是字首
return
false
; }
//如果單詞的所有字母的都沒有多個分支,刪除整個單詞
if (multichildnodeindex == -1)
//如果單詞的除了最後乙個字母,其他的字母有分支
if (multichildnodeindex != word.length() - 1)
return
false
; }
trie查詢效率非常高,但是對空間的消耗還是挺大的,這也是典型的空間換時間。
可以使用壓縮字典樹(compressed trie) ,但是維護相對來說複雜一些。
如果我們不止儲存英文單詞,還有其他特殊字元,那麼維護子節點的集合可能會更多。
可以對trie字典樹做些限制,比如每個節點只能有3個子節點,左邊的節點是小於父節點的,中間的節點是等於父節點的,右邊的子節點是大於父節點的,這就是三分搜尋trie字典樹(ternary search trie)。
參考:
資料結構 TRIE樹
分類 data structure 2009 04 19 22 31 5425人閱讀收藏 舉報trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用h...
資料結構 TRIE樹
trie樹 trie樹就是字元樹,其核心思想就是空間換時間。舉個簡單的例子。給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷他出沒出現過,如果出現了,第一次出現第幾個位置。這題當然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對於某乙個單詞,我要詢問它...
資料結構之字典樹,字首樹 Trie
public class trie public node private node root trie樹的根結點 private int size 樹中結點個數 public trie public int getsize 向字典樹中新增單詞 public void add string str ...