資料結構 Trie字典樹

2022-05-17 00:48:06 字數 2669 閱讀 5423

簡介

字典樹:又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。

優點:利用字串的公共字首來減少查詢時間,最大限度地減少無謂的字串比較,查詢效率比雜湊樹高。

性質:   1.  根節點不包含字元,除根節點外每乙個節點都只包含乙個字元;

2. 從根節點到某一節點,路徑上經過的字元連線起來,為該節點對應的字串;

3.  每個節點的所有子節點包含的字元都不相同。

應用場景:用於統計,排序儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。

**

實現

是否是單詞 (boolean isword)

節點所有的子節點,用map來儲存 (map next)

新增

public

void

add(string word)

current =current.next.get(c);

}//current就是word的最後乙個字元的node

//如果當前的node已經是乙個word,則不需要新增

if (!current.isword)

}

查詢trie查詢操作就比較簡單了,遍歷帶查詢的字串的字元,如果每個節點都存在,並且待查詢字串的最後乙個字元對應的node的isword屬性為true,則表示該單詞存在

public

boolean

contains(string word)

current =node;

}//current就是word的最後乙個字元的node

return

current.isword;

}

字首查詢

public

boolean

containsprefix(string prefix)

current =node;

}return

true

;}

刪除trie的刪除操作就稍微複雜一些,主要分為以下3種情況:

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 ...