trie树的了解
一、知識簡介 ?
??????字典樹(Trie)可以保存一些字符串->值的對應關系,只不過 Trie 的 key 只能是字符串。
Trie 的強大之處就在于它的時間復雜度。它的插入和查詢時間復雜度都為 O(k) ,其中 k 為 key 的長度,與 Trie 中保存了多少個元素無關。Trie 的缺點是空間消耗很高,Trie樹的實現,可以用數組,也可以用指針動態分配,我做題時為了方便就用了數組,靜態分配空間。
????? Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。
??????Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。
Trie樹的基本性質可以歸納為:?
(1)根節點不包含字符,除根節點意外每個節點只包含一個字符。
(2)從根節點到某一個節點,路徑上經過的字符連接起來,為該節點對應的字符串。?
(3)每個節點的所有子節點包含的字符串不相同。
Trie樹有一些特性:
1)根節點不包含字符,除根節點外每一個節點都只包含一個字符。
2)從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。
3)每個節點的所有子節點包含的字符都不相同。
4)如果字符的種數為n,則每個結點的出度為n,這也是空間換時間的體現,浪費了很多的空間。
5)插入查找的復雜度為O(n),n為字符串長度。
基本思想(以字母樹為例):
1、插入過程
對于一個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最后的節點標記為紅色,表示該單詞已插入Trie樹。
2、查詢過程
同樣的,從根開始按照單詞的字母順序向下遍歷trie樹,一旦發現某個節點標記不存在或者單詞遍歷完成而最后的節點未標記為紅色,則表示該單詞不存在,若最后的節點標記為紅色,表示該單詞存在。
二、字典樹的數據結構:
??? 利用串構建一個字典樹,這個字典樹保存了串的公共前綴信息,因此可以降低查詢操作的復雜度。
??? 下面以英文單詞構建的字典樹為例,這棵Trie樹中每個結點包括26個孩子結點,因為總共有26個英文字母(假設單詞都是小寫字母組成)。
??? 則可聲明包含Trie樹的結點信息的結構體:
[cpp]?view plaincopy typedef?struct?Trie_node?? {?? ????int?count;????????????????????//?統計單詞前綴出現的次數?? ????struct?Trie_node*?next[26];???//?指向各個子樹的指針?? ????bool?exist;???????????????????//?標記該結點處是否構成單詞???? }TrieNode?,?*Trie; ?
??????字典樹(Trie)可以保存一些字符串->值的對應關系,只不過 Trie 的 key 只能是字符串。
Trie 的強大之處就在于它的時間復雜度。它的插入和查詢時間復雜度都為 O(k) ,其中 k 為 key 的長度,與 Trie 中保存了多少個元素無關。Trie 的缺點是空間消耗很高,Trie樹的實現,可以用數組,也可以用指針動態分配,我做題時為了方便就用了數組,靜態分配空間。
????? Trie樹,又稱單詞查找樹或鍵樹,是一種樹形結構,是一種哈希樹的變種。典型應用是用于統計和排序大量的字符串(但不僅限于字符串),所以經常被搜索引擎系統用于文本詞頻統計。它的優點是:最大限度地減少無謂的字符串比較,查詢效率比哈希表高。
??????Trie的核心思想是空間換時間。利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的。
Trie樹的基本性質可以歸納為:?
(1)根節點不包含字符,除根節點意外每個節點只包含一個字符。
(2)從根節點到某一個節點,路徑上經過的字符連接起來,為該節點對應的字符串。?
(3)每個節點的所有子節點包含的字符串不相同。
Trie樹有一些特性:
1)根節點不包含字符,除根節點外每一個節點都只包含一個字符。
2)從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。
3)每個節點的所有子節點包含的字符都不相同。
4)如果字符的種數為n,則每個結點的出度為n,這也是空間換時間的體現,浪費了很多的空間。
5)插入查找的復雜度為O(n),n為字符串長度。
基本思想(以字母樹為例):
1、插入過程
對于一個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最后的節點標記為紅色,表示該單詞已插入Trie樹。
2、查詢過程
同樣的,從根開始按照單詞的字母順序向下遍歷trie樹,一旦發現某個節點標記不存在或者單詞遍歷完成而最后的節點未標記為紅色,則表示該單詞不存在,若最后的節點標記為紅色,表示該單詞存在。
二、字典樹的數據結構:
??? 利用串構建一個字典樹,這個字典樹保存了串的公共前綴信息,因此可以降低查詢操作的復雜度。
??? 下面以英文單詞構建的字典樹為例,這棵Trie樹中每個結點包括26個孩子結點,因為總共有26個英文字母(假設單詞都是小寫字母組成)。
??? 則可聲明包含Trie樹的結點信息的結構體:
[cpp]?view plaincopy
總結