字典樹(trie 樹)

2021-07-11 08:47:05 字數 1709 閱讀 4989

trie樹又稱字典樹,字典查詢樹。

trie有三種結構:標準trie 壓縮trie 字尾trie。本篇博文主要介紹標準trie

標準 trie樹的結構

: 所有含有公共字首的字串將掛在樹中同乙個結點下。實際上trie簡明的儲存了存在於串集合中的所有公共字首。 假如有這樣乙個字串集合x。它的標準trie樹如下圖:

上圖(藍色圓形結點為內部結點,紅色方形結點為外部結點),我們可以很清楚的看到字串集合x構造的trie樹結構。其中從根結點到紅色方框葉子節點所經歷的所有字元組成的串就是字串集合x中的乙個串。

注意這裡有乙個問題

如果x集合中有乙個串是另乙個串的字首呢?

比如,x集合中加入串bi。那麼上圖的trie樹在綠色箭頭所指的內部結點i 就應該也標記成紅色方形結點。這樣話,一棵樹的枝幹上將出現兩個連續的葉子結點(這是不合常理的)。

也就是說

字串集合x中不存在乙個串是另外乙個串的字首

。如何滿足這個要求呢?我們可以在x中的每個串後面加入乙個特殊字元$(這個字元將不會出現在字母表中)。這樣,集合x一定會滿足這個要求。

總結:乙個儲存長度為n,來自大小為d的字母表中s個串的集合x的標準trie具有性質如下:

(1) 樹中每個內部結點至多有d個子結點。

(2) 樹有s個外部結點。

(3) 樹的高度等於x中最長串的長度。

(4) 樹中的結點數為o(n)。

標準trie樹的查詢

對於英文單詞的查詢,我們完全可以在內部結點中建立26個元素組成的指標陣列。如果要查詢a,只需要在內部節點的指標陣列中找第0個指標即可(b=第1個指標,隨機定位)。時間複雜度為o(1)。

查詢過程:假如我們要在上面那棵trie中查詢字串bull (b-u-l-l)。

(1) 在root結點中查詢第('b'-'a'=1)號孩子指標,發現該指標不為空,則定位到第1號孩子結點處——b結點。

(2) 在b結點中查詢第('u'-'a'=20)號孩子指標,發現該指標不為空,則定位到第20號孩子結點處——u結點。

(3) ... 一直查詢到葉子結點出現特殊字元'$'位置,表示找到了bull字串

如果在查詢過程中終止於內部結點,則表示沒有找到待查詢字串。

效率:對於有n個英文本母的串來說,在內部結點中定位指標所需要花費o(d)時間,d為字母表的大小,英文為26。由於在上面的演算法中內部結點指標定位使用了陣列隨機儲存方式,因此時間複雜度降為了o(1)。但是如果是中文字,下面在實際應用中會提到。因此我們在這裡還是用o(d)。

查詢成功的時候恰好走了一條從根結點到葉子結點的路徑。因此時間複雜度為o(d*n)。

但是,當查詢集合x中所有字串兩兩都不共享字首時,trie中出現最壞情況。除根之外,所有內部結點都自由乙個子結點。此時的查詢時間複雜度蛻化為o(d*(n^2))

c++實現

(1)普通建樹,所需空間較大

struct node

};node l[1000500];

string s[maxn];

int tot=0;//樹中的節點數

void add(char s,int len)

struct trie

void init()

void add(const char*s)

{int len=strlen(s),u=0,v;

for(int i=0;i

Trie樹(字典樹)

trie樹的核心思想是用空間換時間,通過在樹中儲存字串的公共字首,來達到加速檢索的目的。例如,對於一棵儲存由英文本母組成的字串的trie樹,如下圖 trie樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

字典樹 trie樹 顧名思義是一種樹形結構,屬於雜湊樹的一種。應用於統計 排序 查詢單詞 統計單詞出現的頻率等。它的優點是 利用字串的公共字首來節約儲存空間,最大限度地減少無謂的字串比較,查詢效率比雜湊表高。字典樹的結構特點 根節點不代表任何字元。其他節點從當前節點回溯到根節點可以得到它代表的字串。...

字典樹 trie樹

amy 56 ann 15 emma 30 rob 27 roger 52首先存入amy,level 0表示根,不持有資料。其餘每個節點持有乙個字元 葉子節點持有資料,且持有的字元為 0 level 0 root a level 1 m level 2 y level 3 0 56 level 4新...