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

2021-10-19 18:38:14 字數 2871 閱讀 8547

trie樹是一種非常簡單且有效的資料結構,其主要用於針對包含大量的字串,但所有字串包含字元型別數量較少的情況下,對字串的儲存。最典型的應用就是儲存單詞,因此也稱作字典樹

例如,給定幾個單詞,則可以用trie樹進行儲存:

由上圖可知,trie樹具有幾個性質:

注,樹中每乙個結點都是有唯一的編號 idx

idxid

x,每個結點 idx

idxid

x 都對應某乙個字串中的某個字母,因此這個字母的下乙個字母如果是 j∈[

0,25]

j\in[0,25]

j∈[0,2

5](字母』a-z』 分別對應 『0-25』) 則可以儲存在 tri

e[id

x][j

]trie[idx][j]

trie[i

dx][

j]上此時 tri

e[id

x][j

]trie[idx][j]

trie[i

dx][

j]對於的值是新增的結點編號;

trie樹有一些典型的應用,比如字串高效儲存和查詢、求所有字串的最大公共字首等。下面給出幾個應用樣例

trie樹的最基本的應用就是儲存和查詢單詞:

維護乙個字串集合,支援兩種操作:

「i x」向集合中插入乙個字串x; 「q x」詢問乙個字串在集合**現了多少次。 共有n個操作,輸入的字串總長度不超過 105

10^5

105,字串僅包含小寫英文本母。

輸入輸出要求:第一行包含整數n,表示運算元。接下來n行,每行包含乙個操作指令,指令為」i x」或」q x」中的一種。

#include

using

namespace std;

const

int n =

1e5+10;

int trie[n][26

];// trie樹,只有26個小寫字母。trie[idx][j]表示第idx個結點的第j個孩子

int cnt[n]

;// 每個結點作為乙個單詞的標記,用於記錄每個結點作為單詞結尾的次數

int idx =1;

// 新插入的字元的編號,初始化從1開始編號

char str[n]

;// 用於終端輸入乙個單詞

// 插入字元

void

insert

(char

* s)

cnt[p]++;

}// 查詢是否存在乙個單詞

intquery

(char

* s)

return cnt[p];}

intmain()

return0;

}

給定 n

nn 個整型數 a1,

...,

ana_1, ..., a_n

a1​,..

.,an

​(ai∈[

0,231

]a_i \in [0, 2^]

ai​∈[0

,231

]), 隨機挑選兩個值(可以是同乙個)計算異或,求所有異或結果的最大值。

輸入輸出要求:輸入兩行,第一行為乙個整數n表示整數個數,第二行輸入n個整數。

思路:先從暴力出發,肯定是要兩層for迴圈,鐵定會超時,但是我們發現,對於乙個數a[i]的二進位制位,則如果要尋找乙個最大的數與之異或值最大,則貪心地從最高位開始,尋找與其恰巧位相反的。

假設給定乙個整型數的二進位制位1001011,則期望與之異或最大的肯定是0110100

因此只要遍歷乙個元素 a[i

]a[i]

a[i]

,從高位遍歷其二進位制位( j,j

∈j,j\in\

j,j∈

),每次尋找乙個與 j

jj 相反的位。如果不存在,那則保持當前的位。

如何搜尋呢?可以借助trie樹因為trie樹能夠將每個含有相同字首的字串掛載到一起,因此,當遍歷到第j位二進位制位時,只需要從其中尋找與之相反的位即可,若不存在則按照原始位查詢。

例子:

#include

#include

#include

using

namespace std;

const

int n =

1e5+10;

const

int m =

32* n;

// 假設最多有n個整數,則最多有32*n個二進位制位

int a[n]

;int trie[m][2

], cnt[m]

;// 分別表示trie樹,以及每個結點作為乙個數字的末尾的次數

int idx =1;

// 向trie樹插入乙個結點

void

insert

(int x)

cnt[p]++;

}int

main()

res =

max(res, r);}

printf

("%d"

, res)

;return0;

}

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樹在實現的時候,可以用左兒子右兄弟的表示方法,也可以在每個節點處開設乙個陣列,如上圖的方法。trie樹的主要操作是插入 查詢,也可以進行刪除。插...

字典樹 Trie樹

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