資料字典簡單例子 trie 字典樹的實現方法

2021-10-11 16:09:35 字數 1874 閱讀 3845

又稱單詞查詢樹,trie樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計,排序和儲存大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。

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

它有3個基本性質:

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

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

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

搜尋字典專案的方法為:

(1) 從根結點開始一次搜尋;

(4) 迭代過程……

其他操作類似處理

舉個例子,如下:

題目:給你100000個長度不超過10的單詞。對於每乙個單詞,我們要判斷它是否出現過,如果出現過,求得第一次出現的位置。

如果我們用最傻的方法,對於每乙個單詞,我們都要去查詢它前面的單詞中是否有它。那麼這個演算法的複雜度就是o(n2 )。顯對於100000的範圍難以接受。現在我們換個思路想。假設我要查詢的單詞是abcd,那麼在他前面的單詞中,以b,c,d,f之類開頭的我顯然不必考慮。而只要找以a開頭的中是否存在abcd就可以了。同樣的,在以a開頭中的單詞中,我們只要考慮以b作為第二個字母的,一次次縮小範圍和提高針對性,這樣乙個樹的模型就漸漸清晰了。

好比假設有b,abc,abd,bcd,abcd,efg,hii 這6個單詞,我們構建的樹就是如下圖這樣的:

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

可以看出:

每條邊對應乙個字母。

每個節點對應一項字首。葉節點對應最長字首,即單詞本身。

單詞inn與單詞int有共同的字首「in」, 因此他們共享左邊的一條分支,root->i->in。同理,ate, age, adv, 和ant共享字首"a",所以他們共享從根節點到節點"a"的邊。

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

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

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

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

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

第一:詞頻統計;第二: 字首匹配;第三:去重

適用範圍:資料量大,重複多,但是資料種類小可以放入記憶體

基本原理及要點:實現方式,節點孩子的表示方式

擴充套件:壓縮實現。

python

class

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