演算法學習筆記 Trie 樹(字典樹)

2021-10-17 14:43:34 字數 2857 閱讀 1499

2.3 trie 樹的適用範圍

3. 總結

trie 樹,中文名為字典樹,是一種字串的高效處理演算法。

trie 樹實現的功能就是快速的查詢一堆字串裡面有沒有某個串是另乙個串的字首,字尾等等。

trie 樹首先是一棵樹,比如下面這棵樹就是一棵 trie 樹。

這棵樹是由ab,abd,ac,bd四個字串構成的。

那麼結合圖示,我們會發現 trie 樹有以下幾個特點:

每個字串一定是根節點到某個節點的路徑。

根節點是虛擬節點。

紅色節點表示這個字母是某個字串的末尾。

那麼根據上面這三條性質,我們就可以方便的將每乙個字串唯一的插入 trie 樹而且不引起歧義。

那麼 trie 樹的操作有什麼呢?要怎麼實現呢?

接下來的所有字串,如果沒有特殊說明,都只包含小寫字母。

我們需要乙個結構體來儲存 trie 樹。

trie 樹中需要包含兩個變數:ch[

],fl

agch,flag

ch,f

lag,分別表示當前節點的孩子編號和當前節點是不是乙個單詞的節點。

特別的,0 為超級根,不會存下任何字母資訊。

同時我們需要乙個 init

⁡\operatorname

init

函式來初始化。

**:

struct node

}

我們看看 trie 樹要如何插入。還是看圖。

假設我們現在要插入字串acd

那麼首先看第一位a,有了,那麼我們沿著a向下。

然後我們看到c有了,向下。

然後我們看d,沒有,那麼我們新建乙個節點d跟在c後面。

然後走到頭了,於是標記d是乙個單詞的重點,所以最後的字典樹如下。

trie 樹插入的**如下:

void

insert

(int k)

//k 表示第 k 個字串,採用字元陣列儲存,下標從 1 開始

p = tree[p]

.ch[q];}

tree[p]

.flag =1;

//標記當前為乙個單詞的結尾

}

需要注意的是,如果字串有重複,那麼 fla

gflag

flag

就要 +1 而不是 =1。

trie 樹的查詢。

還是剛才那個 trie 樹。假設我們要查詢acdbda是否存在。當然正式的時候是乙個乙個查詢的,這裡因為懶方便我就兩個一起了。

首先看ab,都在根節點的兒子內,那麼往下走。

然後看cd,都在,繼續往下走:

最後看da,發現da不在,那麼可以判斷bda不在,將 p

1p_1

p1​ 往下走。

最後第乙個字串遍歷完了而且 p

1p_1

p1​ 節點的 fla

gflag

flag

為 1(這一點很重要,因為可能出現找到了卻不是個字串的情況),那麼就存在。

查詢操作的**如下:

bool

find

(int k)if(

!tree[p]

.flag)

return0;

//這不是乙個字串

return1;

}

trie 樹適用於那些有多個文字串和多個模式串,詢問某個串是否為另乙個串的字首等等問題。注意 trie 樹是不能直接進行字串匹配的,需要使用一點科技,這個就是 ac 自動機解決的了。注意不是自動 ac 機

trie 樹形象直觀,就是乙個簡單插入,刪除的過程。

學習筆記 字典樹(Trie)

日期 2020 08 25 目錄三 碎碎念 字典樹,英文名 trie。顧名思義,就是乙個像字典一樣的樹。可能有些不太形象,那我們舉個栗子叭 比如有乙個 duliu dalao daunting 令人望而生畏的 zhltao 那麼我們可以這麼存 仔細看看的話,其實挺像查字典的 我翻開一本如上的字典,翻...

trie樹 字典樹 DFA演算法

service public class sensitivewordutil extends timertask return else string strs keyword.split setkeywordset new hashset for string str strs sensitive...

演算法程式設計 Trie樹(字典樹)

trie樹是一種非常簡單且有效的資料結構,其主要用於針對包含大量的字串,但所有字串包含字元型別數量較少的情況下,對字串的儲存。最典型的應用就是儲存單詞,因此也稱作字典樹。例如,給定幾個單詞,則可以用trie樹進行儲存 由上圖可知,trie樹具有幾個性質 注,樹中每乙個結點都是有唯一的編號 idx i...