海量資料處理 trie樹

2021-07-16 12:47:26 字數 4225 閱讀 5301

1. 什麼是trie樹

trie樹

,又稱單詞查詢樹、字典樹

,是一種

樹形結構

,是一種雜湊樹的變種,是一種用於快速檢索的多叉樹結構。典型應用是用於統計和排序大量的字串(但不僅限於字串),所以經常被搜尋引擎系統用於文字詞頻統計。它的優點是:最大限度地減少無謂的字串比較,查詢效率比雜湊表

高。

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

trie樹也有它的缺點,trie樹的記憶體消耗非常大.當然,或許用左兒子右兄弟的方法建樹的話,可能會好點.

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

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

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

和二叉查詢樹不同,在trie樹中,每個結點上並非儲存乙個元素。

在trie樹上進行檢索類似於查閱英語詞典。

一棵m度的trie樹或者為空,或者由m棵m度的trie樹構成。

例如,電子英文詞典,為了方便使用者快速檢索英語單詞,可以建立一棵trie樹。例如詞典由下面的單詞成:a、b、c、aa、ab、ac、ba、ca、aba、abc、baa、bab、bac、cab、abba、baba、caba、abaca、caaba

再舉乙個例子。給出一組單詞,inn, int, at, age, adv, ant, 我們可以得到下面的trie:

可以看出:

查詢操縱非常簡單。比如要查詢int,順著路徑i -> in -> int就找到了。

2. trie樹的實現

對於乙個單詞,從根開始,沿著單詞的各個字母所對應的樹中的節點分支向下走,直到單詞遍歷完,將最後的節點標記為紅色,表示該單詞已插入trie樹。

其方法為:

(1) 從根結點開始一次搜尋;

(4) 迭代過程……

即從根開始按照單詞的字母順序向下遍歷trie樹,一旦發現某個節點標記不存在或者單詞遍歷完成而最後的節點未標記為紅色,則表示該單詞不存在,若最後的節點標記為紅色,表示該單詞存在。如下圖中:trie樹中存在的就是abc、d、da、dda四個單詞。在實際的問題中可以將標記顏色的標誌位改為數量count等其他符合題目要求的變數。  

//巨集定義

#define true 1

#define false 0

#define null 0

#define ok 1

#define error 0

#define infeasible -1

#define overflow -2

const int num_chars = 26;

class trie ;

trie_node* root; //根結點(指標)

};//

#include "stdafx.h"

trie::trie_node::trie_node()

//找到,獲取資料,成功返回

if ( location != null && location->data != null )

else return 0;// 不合法的單詞

} int trie::insert(const char* word, const char* entry)

if (location->data != null) result = 0;//欲插入的單詞已經存在

else

return result;

} int main(){

trie t;

char entry[100];

t.insert("a", "det");

t.insert("abacus","noun");

t.insert("abalone","noun");

t.insert("abandon","verb");

t.insert("abandoned","adj");

t.insert("abashed","adj");

t.insert("abate","verb");

t.insert("this", "pron");

if (t.trie_search("this", entry))

cout<

在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樹(字典樹)

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

海量資料處理

1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...

海量資料處理

給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...