標准Trie字典樹學習一:原理解析


特別聲明:

  博文主要是學習過程中的知識整理,以便之后的查閱回顧。部分內容來源於網絡(如有摘錄未標注請指出)。內容如有差錯,也歡迎指正!

 

系列文章:

1. 字典樹Trie學習一:原理解析

2. 字典樹Trie學習二:Java實現方式之一

 

一、基本概念(來源於網絡)

 Trie樹又稱字典樹、單詞查找樹、前綴樹等,是一種樹形結構,是一種哈希樹的變種。典型應用是用於統計,排序和保存大量的字符串(但不僅限於字符串),所以經常被搜索引擎系統用於文本詞頻統計。

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

  缺點:基於空間換時間的思想,所以系統中若存在大量的沒有公共前綴的字符串則會消耗大量內存。(使用左兒子右兄弟的方法建樹的話,可能相對會好一些,有興趣的小伙伴可以自己研究下。)

 

核心思想:空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。

 

三個特性:

  1.根節點不包含字符,除根節點外每一個節點都只包含一個字符。

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

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

 

  例:and, as, at, cn, com構建的Trie樹如下,

 

 

二、Trie樹的基本操作

  假設存在字符串str,Trie樹的根結點為root,i=0,p=root

  1.插入

    1)取str[i],判斷p->next[str[i]-'a']是否為空,若為空,則建立結點temp,並將p->next[str[i]-‘a’]指向temp,然后p指向temp;若不為空,則p=p->next[str[i]-'a'];
    2)i++,繼續取str[i],循環1)中的操作,直到遇到結束符'\0',此時將當前結點p中的isStr置為true。
 
  2.查找  
    1)取str[i],判斷判斷p->next[str[i]-‘a’]是否為空,若為空,則返回false;若不為空,則p=p->next[str[i]-'a'],繼續取字符。
    2)重復1)中的操作直到遇到結束符'\0',若當前結點p不為空並且isStr為true,則返回true,否則返回false。
 

  3.刪除

     可以遞歸刪除整棵樹

 

三、Trie樹的復雜度

  1. 插入、查找的時間復雜度均為O(N), N為字符串的長度。

  2.英文字符為例,空間復雜度是26^n, 可采用<雙數組實現>來改善。

 

 

四、Trie樹的應用場景

1.字符串檢索、詞頻統計

 將已知的一些字符串(字典)的有關信息實現保存到trie樹里,查找另外一些未知字符串是否出現過或者出現頻率。

例如:

將要匹配詞作為詞典,再給出一段文本或者文章。匹配判斷文本或文章中是否存在詞典中的詞。

 

2.字符串最長公共前綴

Trie樹利用多個字符串的公共前綴來節省存儲空間,反之,當我們把大量字符串存儲到一棵trie樹上時,我們可以快速得到某些字符串的公共前綴。

 

3.排序

 只要先序遍歷整棵樹,輸出相應的字符串便是按字典排序的結果

 

 

 

參考:

     數據結構之Trie


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM