Trie樹就是字符樹,其核心思想就是空間換時間
舉個簡單的例子。
給你100000個長度不超過10的單詞。對于每一個單詞,我們要判斷他出沒出現(xiàn)過,如果出現(xiàn)了,第一次出現(xiàn)第幾個位置。
這題當(dāng)然可以用hash來,但是我要介紹的是trie樹。在某些方面它的用途更大。比如說對于某一個單詞,我要詢問它的前綴是否出現(xiàn)過。這樣hash就不好搞了,而用trie還是很簡單。
現(xiàn)在回到例子中,如果我們用最傻的方法,對于每一個單詞,我們都要去查找它前面的單詞中是否有 它。那么這個算法的復(fù)雜度就是O(n^2)。顯然對于100000的范圍難以接受?,F(xiàn)在我們換個思路想。假設(shè)我要查詢的單詞是abcd,那么在他前面的單 詞中,以b,c,d,f之類開頭的我顯然不必考慮。而只要找以a開頭的中是否存在abcd就可以了。同樣的,在以a開頭中的單詞中,我們只要考慮以b作為 第二個字母的……這樣一個樹的模型就漸漸清晰了……
假設(shè)有b,abc,abd,bcd,abcd,efg,hii這6個單詞,我們構(gòu)建的樹就是這樣的。

對于每一個節(jié)點,從根遍歷到他的過程就是一個單詞,如果這個節(jié)點被標(biāo)記為紅色,就表示這個單詞存在,否則不存在。
那么,對于一個單詞,我只要順著他從跟走到對應(yīng)的節(jié)點,再看這個節(jié)點是否被標(biāo)記為紅色就可以知道它是否出現(xiàn)過了。把這個節(jié)點標(biāo)記為紅色,就相當(dāng)于插入了這個單詞。
這樣一來我們詢問和插入可以一起完成,所用時間僅僅為單詞長度,在這一個樣例,便是10。
我們可以看到,trie樹每一層的節(jié)點數(shù)是26^i級別的。所以為了節(jié)省空間。我們用動態(tài)鏈表,或者用數(shù)組來模擬動態(tài)。空間的花費,不會超過單詞數(shù)×單詞長度。