Trie樹 字典樹

2021-09-07 16:57:46 字數 1638 閱讀 4603

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是最大限度地減少無謂的字串比較,查詢效率比較高。

trie的核心思想是空間換時間,利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。

它有3個基本性質:

根節點不包含字元,除根節點外每乙個節點都只包含乙個字元。

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

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

咱們先來看乙個問題:假如現在給你10萬個長度不超過10的單詞,對於每乙個單詞,我們要判斷它出沒出現過,如果出現了,求第一次出現在第幾個位置。對於這個問題,我們該怎麼解決呢?

如果我們用最傻的方法,對於每乙個單詞,我們都要去查詢它前面的單詞中是否有它。那麼這個演算法的複雜度就是o(n^2)。顯然對於10萬的範圍難以接受。

換個思路想:

即如果現在有b,abc,abd,bcd,abcd,efg,hii 這6個單詞,我們可以構建一棵如下圖所示的樹:

如上圖所示,對於每乙個節點,從根遍歷到他的過程就是乙個單詞,如果這個節點被標記為紅色,就表示這個單詞存在,否則不存在。

那麼,對於乙個單詞,只要順著他從根走到對應的節點,再看這個節點是否被標記為紅色就可以知道它是否出現過了。把這個節點標記為紅色,就相當於插入了這個單詞。

這樣一來我們查詢和插入可以一起完成,所用時間僅僅為單詞長度(在這個例子中,便是10)。這就是一棵trie樹。

我們可以看到,trie樹每一層的節點數是26^i級別的。所以為了節省空間,我們還可以用動態鍊錶,或者用陣列來模擬動態。而空間的花費,不會超過單詞數×單詞長度。

trie樹是簡單但實用的資料結構,通常用於實現字典查詢。我們做即時響應使用者輸入的ajax搜尋框時,就是trie開始。本質上,trie是一顆儲存多個字串的樹。相鄰節點間的邊代表乙個字元,這樣樹的每條分支代表一則子串,而樹的葉節點則代表完整的字串。和普通樹不同的地方是,相同的字串字首共享同一條分支。

下面,再舉乙個例子。給出一組單詞,inn, int, at, age, adv, ant, 我們可以得到下面的trie:

可以看出:

查詢操縱非常簡單。比如要查詢int,順著路徑i -> in -> int就找到了。

搭建trie的基本演算法也很簡單,無非是逐一把每則單詞的每個字母插入trie。插入前先看字首是否存在。如果存在,就共享,否則建立對應的節點和邊。比如要插入單詞add,就有下面幾步:

考察字首"a",發現邊a已經存在。於是順著邊a走到節點a。

考察剩下的字串"dd"的字首"d",發現從節點a出發,已經有邊d存在。於是順著邊d走到節點ad

考察最後乙個字元"d",這下從節點ad出發沒有邊d了,於是建立節點ad的子節點add,並把邊ad->add標記為d。

1、乙個文字檔案,大約有一萬行,每行乙個詞,要求統計出其中最頻繁出現的前10個詞,請給出思想,給出時間複雜度分析

2、尋找熱門查詢

原題:搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個記錄,這些查詢串的重複讀比較高,雖然總數是1千萬,但是如果去除重複和,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...

字典樹 trie樹

amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...