Trie基礎html
Trie字典樹又叫前綴樹(prefix tree),用以較快速地進行單詞或前綴查詢,Trie節點結構以下:git
//208. Implement Trie (Prefix Tree)
class TrieNode{ public: TrieNode* children[26]; //或用鏈表、map表示子節點 bool isWord; //標識該節點是否爲單詞結尾 TrieNode(){ memset(children,0,sizeof(children)); isWord=false; } };
插入單詞的方法以下:github
void insert(string word) { TrieNode* p=root; for(auto w:word){ if(p->children[w-'a']==NULL) p->children[w-'a']=new TrieNode; p=p->children[w-'a']; } p->isWord=true; }
假若有單詞序列 ["a", "to", "tea", "ted", "ten", "i", "in", "inn"],則完成插入後有以下結構:函數
Trie的root節點不包含字符,以上藍色節點表示isWord標記爲true。在建好的Trie結構裏查找單詞或單詞前綴的方法以下:spa
/** Returns if the word is in the trie. */ bool search(string word) { TrieNode* p=root; for(auto w:word){ if(p->children[w-'a']==NULL) return false; p=p->children[w-'a']; } return p->isWord; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { TrieNode* p=root; for(auto w:prefix){ if(p->children[w-'a']==NULL) return false; p=p->children[w-'a']; } return true; }
相關LeetCode題:code
208. Implement Trie (Prefix Tree) 題解htm
677. Map Sum Pairs 題解blog
1032. Stream of Characters 題解leetcode
Trie與Hash table比較
一樣用於快速查找,常常會拿Hash table和Trie相互比較。從以上Trie的構建和查找代碼可知,構建Trie的時間複雜度和文本長度線性相關、查找時間複雜度和單詞長度線性相關;對Trie空間複雜度來講,若是數據按前綴聚攏,那麼有利於減小Trie的存儲空間。
對Hash table而言,雖然查找過程是O(1),但另需考慮hash函數自己的時間消耗;另對於字符串prefix查找問題,並不能直接用Hash table解決,要麼作一些提早功夫,將各個prefix也提早存入Hash table。
相關LeetCode題:
648. Replace Words Trie題解 HashTable題解
Trie的應用
Trie除了能夠用於字符串檢索、前綴匹配外,還能夠用於詞頻統計、字符串排序、搜索自動補全等場景。
相關LeetCode題:
642. Design Search Autocomplete System 題解
原文出處:https://www.cnblogs.com/bangerlee/p/10945434.html