1. 什麼是trie樹
trie樹
,又稱單詞查詢樹、字典樹
,是一種
樹形結構
,是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表
高。
trie的核心思想是空間換時間。利用字串的公共字首來降低查詢時間的開銷以達到提高效率的目的。
trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹的話,可能會好點。
一棵m度的trie樹或者為空,或者由m棵m度的trie樹構成。
再舉乙個例子。給出一組單詞,inn, int, at, age, adv, ant, 我們可以得到下面的trie:
可以看出:
查詢操縱非常簡單。比如要查詢int,順著路徑i -> in -> int就找到了。
2. trie樹的實現
對於乙個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最後的節點標記為紅色,表示該單詞已插入trie樹。
其方法為:
(1) 從根結點開始一次搜尋;
(4) 迭代過程……
class trienode
trienode *nexts[26];
// string word;
bool is_word;
};class trie
// inserts a word into the trie.
void insert(string word) else if(word[i] >= 'a' && word[i] <= 'z')else
if(work->nexts[c] == null)
work = work->nexts[c];
//if(work == null) work = new trienode();
}work->is_word = true;
}// returns if the word is in the trie.
bool search(string word)
// returns if there is any word in the trie
// that starts with the given prefix.
bool startswith(string prefix)
trienode *find(string word)else if(word[index] >= 'a' && word[index] <= 'z')
index++;
work = work->nexts[c];
}return work;
}private:
trienode* root;
};// your trie object will be instantiated and called as such:
// trie trie;
// trie.insert("somestring");
// trie.search("key");
在trie樹中查詢乙個關鍵字的時間和樹中包含的結點數無關,而取決於組成關鍵字的字元數。而二叉查詢樹的查詢時間和樹中的結點數有關o(log2n)。
如果要查詢的關鍵字可以分解成字串行且不是很長,利用trie樹查詢速度優於二叉查詢樹。如:
若關鍵字長度最大是5,則利用trie樹,利用5次比較可以從26^5=11881376個可能的關鍵字中檢索出指定的關鍵字。而利用二叉查詢樹至少要進行
3. trie樹的應用:
事先將已知的一些字串(字典)的有關資訊儲存到trie樹里,查詢另外一些未知字串是否出現過或者出現頻率。
舉例:1)有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
2)給出n 個單詞組成的熟詞表,以及一篇全用小寫英文書寫的文章,請你按最早出現的順序寫出所有不在熟詞表中的生詞。
3)給出乙個詞典,其中的單詞為不良單詞。單詞均為小寫字母。再給出一段文字,文字的每一行也由小寫字母構成。判斷文字中是否含有任何不良單詞。例如,若rob是不良單詞,那麼文字problem含有不良單詞。
4)1000萬字串,其中有些是重複的,需要把重複的全部去掉,保留沒有重複的字串
5)尋找熱門查詢:搜尋引擎會通過日誌檔案把使用者每次檢索使用的所有檢索串都記錄下來,每個查詢串的長度為1-255位元組。假設目前有一千萬個記錄,這些查詢串的重複讀比較高,雖然總數是1千萬,但是如果去除重複和,不超過3百萬個。乙個查詢串的重複度越高,說明查詢它的使用者越多,也就越熱門。請你統計最熱門的10個查詢串,要求使用的記憶體不能超過1g。
trie樹利用多個字串的公共字首來節省儲存空間,反之,當我們把大量字串儲存到一棵trie樹上時,我們可以快速得到某些字串的公共字首。舉例:
1) 給出n 個小寫英文本母串,以及q 個詢問,即詢問某兩個串的最長公共字首的長度是多少. 解決方案:
首先對所有的串建立其對應的字母樹。此時發現,對於兩個串的最長公共字首的長度即它們所在結點的公共祖先個數,於是,問題就轉化為了離線 (offline)的最近公共祖先(least common ancestor,簡稱lca)問題。
而最近公共祖先問題同樣是乙個經典問題,可以用下面幾種方法:
1. 利用並查集(disjoint set),可以採用採用經典的tarjan 演算法;
2. 求出字母樹的尤拉序列(euler sequence )後,就可以轉為經典的最小值查詢(range minimum query,簡稱rmq)問題了;
trie樹是一棵多叉樹,只要先序遍歷整棵樹,輸出相應的字串便是按字典序排序的結果。
舉例: 給你n 個互不相同的僅由乙個單詞構成的英文名,讓你將它們按字典序從小到大排序輸出。
如字尾樹,ac自動機等。
trie樹 應用於統計和排序
1.什麼是trie樹 trie樹 又稱單詞查詢樹 字典樹 是一種 樹形結構 是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表 高。trie的核心思...
Trie樹 應用於統計和排序
1.什麼是trie樹 trie樹 又稱單詞查詢樹 字典樹 是一種 樹形結構 是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表 高。trie的核心思...
Trie樹 應用於統計和排序
1.什麼是trie樹 trie樹,又稱單詞查詢樹 字典樹,是一種樹形結構,是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串 但不僅限於字串 所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是 最大限度地減少無謂的字串比較,查詢效率比雜湊表高。trie的核心思想是...