字典樹(字首樹)簡單實現
什麼時字典樹
又稱單詞查詢樹,Trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。
基本操作
查詢、插入、刪除(此段程式碼沒有實現刪除)
實現
在每一個節點上不儲存資訊,把資訊儲存在邊(路徑)上。
如上圖所示將字串的狀態表示在節點之間的連線線上。
插入:
遍歷需要插入的字串,從樹的根節點開始查詢,是否存在當前邊,如果不存在則新建一條邊,然後指向下一個節點。如果存在直接指向下一個個節點。
查詢:
-
查詢一個字串是否存在
查詢一個字串是否存在需要在節點上封裝一個狀態,表示是否有字串已當前節點結尾。
原因,假如我們向樹中插入一個字串“abcdefg”,然後查詢是否有“abc”的字串,也會查詢出來。
擴充套件:
-
查詢是否有字串已這個字串開頭
查詢是否有字串已這個字串開頭,只需看在這個樹中能否將這個字串走完
刪除:
刪除只需要將每條鏈上的狀態取消掉就行。
public class Trie {
class TrieNode{
TrieNode[] next; // 可以用 hash 實現跟複雜的狀態
int end;
public TrieNode() {
next = new TrieNode[26];
end = 0;
}
}
TrieNode root;
public Trie() {
root = new TrieNode();
}
public void insert(String word) { // 插入
int n = word.length();
TrieNode p = root;
for(int i = 0; i < n; i++){
int ind = word.charAt(i) - 'a';
if(p.next[ind] == null) p.next[ind] = new TrieNode(); // 如果不存在則新建一條邊
p = p.next[ind]; // 指向下一個節點
}
p.end++;
}
public boolean search(String word) { // 查詢
int n = word.length();
TrieNode p = root;
for(int i = 0; i < n; i++){
int ind = word.charAt(i) - 'a';
if(p.next[ind] == null) return false;
p = p.next[ind];
}
return p.end > 0;
}
}
相關文章
- 字首樹及其Java實現Java
- kd樹的簡單實現
- 字典樹及其C++實現C++
- 字首樹
- Trie樹,字典樹
- 字典樹
- 208. 實現 Trie (字首樹)-pythonPython
- ABC353E字典樹處理最長公共字首
- 【Tire 求字典出現的字首個數】hihocoder 1014 Trie樹
- JavaScript實現簡單二叉查詢樹JavaScript
- 字典樹(Trie)
- 字典樹Trie
- hdu1251 字典樹的應用(查詢公共字首)
- 【演算法】字首樹演算法
- Unity嘗試實現簡單的行為樹-01Unity
- 資料結構之樹( 線段樹,字典樹)資料結構
- 字典樹學習
- 字典樹專題
- 二叉搜尋樹應用-判斷一個單詞是否拼寫正確,實現簡單字典
- 資料結構基礎--字首樹&&字尾樹資料結構
- 用python實現的可以自動補全的字首樹Python
- 字典樹的應用
- 資料結構的故事之二叉樹, 字首樹, N叉樹資料結構二叉樹
- AC自動機+trie樹實現高效多模式匹配字典模式
- codevs 4189 字典【字典樹】dev
- 線段樹簡單思路
- 資料結構丨字首樹資料結構
- 樹上字首和與差分
- 字典樹練習(一)hihocoder 1014(求相同字首的數目)
- java實現樹Java
- 樹元件實現元件
- C#實現前向最大匹、字典樹(分詞、檢索)C#分詞
- 怎樣實現基於Trie樹和字典的分詞功能分詞
- 資料結構-字典樹資料結構
- 一些“字典樹”典
- [leetcode/lintcode 題解] 微軟 面試題:實現 Trie(字首樹)LeetCode微軟面試題
- 【模板】樹分塊(簡單版)
- 機器學習實戰(三)決策樹ID3:樹的構建和簡單分類機器學習