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