字典樹 Trie 入門篇

2021-10-05 11:04:14 字數 1616 閱讀 4458

字典樹

trie(字典樹)又稱字首樹

給出字串集合:code、cook、five、file、fat,我們設根節點為空節點,那麼其trie樹如下所示:

字典樹又稱字首樹,給出乙個字串集合,我們可以通過公共字首將整個字串集合存到乙個樹形結構中,一旦形成了集合中的字串,我們只需在樹上的相應節點打上標記

儲存我們採用雙陣列儲存的方式,其中next陣列是二維陣列,第二維之所以是26是因為每個節點都可能連線26個字母,另外乙個標記陣列可以有兩種形式:

const

int maxn=max_len*num;

//字串最大長度乘以數量

int next[maxn][26

];bool vis[maxn]

;//該結點結尾的字串是否存在

int num[maxn]

;//該結點結尾的字串是否存在,存在則儲存下標

不難發現我們在儲存時是將字元轉化為0-25的數字下標:

建樹如何建樹?我們採用動態開點的方式,這裡類似鏈式前向星那樣。next陣列第一維儲存的就是動態開點的數,第二維是接下來指向的字元(0-25)

每個字串的第乙個字元儲存在下標為0的集合中,而且root實際上是不存在的,也就是說如果有多種字母開頭的字典樹,那麼這實際上是乙個森林

建樹的過程即插入的過程,時間複雜度為o(n*len)

標記是否存在

int cnt=0;

void

insert

(char

*s) vis[p]=1

;}

標記並儲存下標

int cnt=0;

void

insert

(char

*s,int k)

num[p]

=k;}

查詢字串

查詢時,首先目標串的每乙個字首必須都出現,也就是next[p][s[i]-『a』]都有值,那麼查詢到最後乙個節點時,如果該節點被標記,那麼vis[p]就不為0,否則為0,因此直接返回vis[p]

查詢的時間複雜度為o(len)

int

find

(char

*s)return vis[p]

;}

簡單模板
const

int maxn=max_len*num;

//每個字串最大長度乘以字串數量

struct trie

void

insert

(char

*s,int k)

vis[p]=1

;}intfind

(char

*s)return vis[p];}

};

線段樹之入門篇

線段樹 interval tree 是把區間逐次二分得到的一樹狀結構,它反映了包括歸併排序在內的很多分治演算法的問題求解方式。上圖是一棵典型的線段樹,它對區間 1,10 進行分割,直到單個點。這棵樹的特點 是 1.每一層都是區間 a,b 的乙個劃分,記 l b a 2.一共有log2l層 3.給定乙...

Trie樹(字典樹)

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

字典樹 Trie樹

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