Trie字典樹(超詳細!!!)

2022-03-22 11:38:56 字數 2769 閱讀 2597

字典樹,也稱trie、字母樹,指的是某個字串集合對應的形如下圖的有根樹。樹的每條邊上對應有恰好乙個字元,每個頂點代表從根到該節點的路徑所對應的字串(將所有經過的邊上的字元按順序連線起來)。有時我們也稱trie上的邊為轉移,頂點為狀態。

一棵空trie僅包含乙個根節點,該點的字元指標均指向空。

當需要插入乙個字串s時,我們令乙個指標p起初指向根節點。然後,依次掃瞄s中的每個字元 c :

1.若p的c字元指標指向乙個己經存在的節點q,則令p=q。

2.若p的c字元指標指向空,則新建乙個節點q ,令p的 c 字元指標指向q,然後令p=q。 當s中的字元掃瞄完畢時,在當前節點p上標記它是乙個字串的末尾。

當需要查詢乙個字串s在trie中是否存在時,我們令乙個指標p起初指向根節點,然後依次掃瞄s中的每個字元c :

1.若p的c字元指標指向空,則說明s沒有被插入過trie ,結束查詢。

2.若p的c字元指標指向乙個已經存在的節點q,則令p=q 。

當s中的字元掃瞄完畢時,若當前節點p被標記為乙個字串的末尾,則說明s 在 trie 中存在,否則說明s沒有被插入過trie。

在上圖所示的例子中,需要插入和查詢的字串都由小寫字母構成,所以trie 的每個節點具有 26個字元指標,分別為a到z。上圖展示了在一棵空 trie中依次插入 " cab " " cos " " car " " cat " " cate"和"rain"後的trie 的形態,灰色標記了單詞的末尾節點。

可以看出在trie 中,字元資料都體現在樹的邊(指標)上,樹的節點僅儲存一些額外資訊,例如單詞結尾標記等。其空間複雜度是o ( nc ) ,其中 n 是節點個數, c是字符集的大小。

初始化

1.int ch[n][z];   //

z為字符集大小  

2.bool

bo[n];     //

若bo=true則表示從根到該點經過的邊上字母組成的字串是實際字串集合中的元素

現在要對乙個字符集為小寫英文本母的trie插入乙個字串s:

1.void insert(char *s)   

10.   bo[u] = true

;  11. //

在串的結尾處將bo賦值,表示它代表乙個實際字串集合中的元素

12.}

查詢乙個字串s是否是給定字串集合中某個串的字首:

1.bool find(char

s)   

9.    return

true

;  10.}  

【例題1】phone list(資訊學奧賽一本通 1471)

【題目描述】

給定 n 個長度不超過 10 的數字串,問其中是否存在兩個數字串 s,t,使得 s 是 t 的字首,多組資料。

【輸入】

第一行乙個整數 t,表示資料組數。 對於每組資料,第一行乙個數 n,接下來 n 行輸入 n 個數字串。

【輸出】

對於每組資料,若存在兩個數字串 s,t,使得 s 是 t 的字首,則輸出 no ,否則輸出 yes 。 請注意此處結果與輸出的對應關係!

【輸入樣例】23

911

97625999

91125426

5113

12340

123440

12345

98346

【輸出樣例】

【例題2】the xor largest pair(資訊學奧賽一本通 1472)

【題目描述】

在給定的 n 個整數 a1,a2,…, an 中選出兩個進行異或運算,得到的結果最大是多少?

【輸入】

第一行乙個整數 n。 第二行 n 個整數 ai。

【輸出】

乙個整數表示答案。

【輸入樣例】

5 2 9 5 7 0

【輸出樣例】

14思路:

對於每個 i ( 1<=i <= n ) ,我們希望找到乙個 j ( 1 <=j < i ) ,使ai xor aj最大。

我們可以把每個整數看作長度為 32 的二進位制 01 串(數值較小時在前邊補 0 ),並且把a1~ai-1對應的 32 位二進位制串插入一棵 trie 樹(最低二進位制位為葉子節點)。接下來,對於 ai 對應的 32 位二進位制串,我們在 trie 中進行一次與查詢類似的過程,每一步都嘗試沿著「與 ai 的當前位相反的字元指標」向下訪問。若「與 ai 的當前位相反的字元指標」指向空節點,則只好訪問與 ai 當前位相同的字元指標。根據 xor 運算「相同得 0 ,不同得 1 」的性質,該方法即可找出與 a i做 xor 運算結果最大的aj。

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新...