Trie樹的學習

2021-07-23 10:26:49 字數 2441 閱讀 3844

所寫內容,是對自己所學知識的乙個記錄罷了。

1.簡介

最近在做中國人名識別的時候,看到一篇文章是基於角色的人名識別,而角色字典中有2個角色是用雙陣列tire樹來建立的,當時沒有看懂,於是來先學習trie樹。

trie樹,又稱字典樹,單詞查詢樹或者字首樹等,是一種快速 檢索的多叉樹結構。比如,英文本母的字典樹是乙個20叉樹,數字的字典樹是乙個10叉樹。

由上圖,我們可以歸為trie樹的基本性質為:

(1)根節點不包含字元,除根節點外每個節點只包含乙個字元

(2)從根節點到某乙個節點,路徑上經過的字元鏈結起來,為該節點對應的字串

(3)每個節點的所有子節點包含的字串不相同。

2.複雜度

trie的插入(insert)、刪除( delete)和查詢(find)都非常簡單,用乙個一重迴圈即可,即第i 次迴圈找到前i 個字母所對應的子樹,然後進行相應的操作。

(1)插入過程

對於乙個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最後的節

點標記為紅色,表示該單詞已插入trie樹。

(2)查詢過程

同樣的,從根開始按照單詞的字母順序遍歷trie樹,一旦發現某個節點標記不能存在或者遍歷完成而最優的節點

未標記為紅色,則表示該單詞不存在;反之,則表示該單詞存在。

trie樹的強大之處在於它的時間複雜度,它的插入和查詢時間複雜度都為 o(n) ,其中n為key的長度,與 trie 中儲存了多少個元素無關。hash 表號稱是 o(1) 的,但在計算 hash 的時候就肯定會是 o(n) ,而且還有碰撞之類的問題;trie 的缺點是空間消耗很高。例如,英文本母的trie樹的空間複雜度要為26^n。實現這棵字母樹,我們用最常見的陣列儲存(靜態開闢記憶體)即可,當然也可以開動態的指標型別(動態開闢記憶體)。

trie樹的一些特性

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

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

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

(4)如果字元的種數為n,則每個節點的出度為n,這也是空間換時間的體現,浪費了很多的空間。

(5)插入查詢的複雜度為o(n),n為字串長度。

3.應用

trie樹是一種樹形結構,是一種雜湊樹的變種。所以二者有著千絲萬縷的關係。trie的核心思想是犧牲空間換取時間的效率。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。

(1)詞頻統計

典型的應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎用於文字詞頻統計。但是hash或者堆也可以解決這個問題,那為什麼還要用trie樹呢?因為當記憶體有限的時候,我們可以用trie樹來壓縮空間,因為公共字首都是用乙個節點儲存的。最大限度的減少無謂的字串比較,查詢效率比雜湊表要高。

(2)字首匹配

這個就是我在開始提到的人名識別的角色的建立用的。如果想深入了解,可參考好了,想要大家了解一下還有這麼個應用而已^_^。繼續往下看,還拿上面的圖來說,如果我想獲得所有以「a」開頭的字串,從圖中可以名下的看到是and,as,at。那麼,如果不用trie樹呢?我們最容易想到的就是對字串集從頭到尾進行搜尋  ,看每個字串是否為字串集中的字首子串,其複雜度為o(n^2)。這個複雜度可是算很高的了。可能還會有人想到用hash,我們使用hash存下所有字串的所有字首子串。建立存有子串的hash複雜度為o(n*len)。查詢的複雜度為o(n)。那使用trie樹的有點在哪呢?如果我們要查詢如字串"abcd"是否為某個字串的字首時,顯然以"b","c","d"等等不是以"a"開頭的字串就不用查詢了,這樣迅速縮小了查詢範圍且提高了查詢的針對性。所以建立trie樹的複雜度為

o(n*len),而建立+查詢在trie樹是可以同時執行的,建立的過程也就是查詢的過程,而hash是不能實現這個功能的所以總的複雜度為o(n*len),實際查詢的複雜度只是o(len)。

(3)排序

trie是一棵多叉樹,只要先序遍歷整棵樹(先序是樹的乙個基本遍歷,後面也記錄一下,省的忘了 ^_^),輸出相應的字串便是按字典序排序的結果。例如@ 給你n 個互不相同的僅由乙個單詞構成的英文名,讓你將它們按字典序從小到大排序輸出。

下面以二叉樹為例子,講述一下先序,中序及後序遍歷。一般約定遍歷時左節點優於右節點。

前序:先遍歷根節點,在處理左右節點。即:根-->左-->右

中序:先遍歷左節點,然後處理根節點,左右處理右節點。即:

左-->

根-->右

後序:先遍歷左右節點,再處理根節點。即:左-->右

-->根

(4)作為其他資料結構和演算法的輔助結構

例如:字尾樹(這個在前面提到的人名識別也有應用),ac自動機等

還在繼續學習中。。。先記錄到這。。。

4.參考資料

(1)(2)

Trie 字典樹 的學習

trie樹,即字典樹,又稱單詞查詢樹或鍵樹,是一種樹形結構,是一種雜湊樹的變種。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的...

Trie 樹學習下

今天把trie樹徹底的看了下。發現網上有兩篇非常好的文章,通過他們的部落格,我對trie樹有了大題的了解。並且通過理解 消化 綜合他們的知識,再結合我自己的程式設計愛好,我也把具體的程式實現了一遍,這樣能對trie樹有更加深刻的認識!他們是 勇幸 thinking 和 maik 感謝他們。下面的分析...

Trie 樹學習筆記

trie 樹是一種能夠高效的儲存和使用字串集合的一種東西。它的作用跟 texttt 十分相似,都是用來儲存字串集合的利器,但是,trie 樹卻比 texttt 的時間複雜度更加優秀。詳情見時空複雜度分析。trie 樹究竟是什麼東西呢?讓我們通過儲存乙個字串集合來直觀的了解它。已知我們要儲存這樣的字串...