字典樹(Trie)

Showball發表於2024-07-09

字典樹(Trie)

Trie 是一種能夠快速插入和查詢字串的多叉樹結構。

節點的編號各不相同,根節點編號為 \(0\) ,其他節點用來標識路徑。

還可以標記單詞插入的次數。邊表示字元。

一般情況下,Trie維護字串的集合,支援以下兩種操作:

1.向集合中插入一個字串。

2.向集合中查詢一個字串。

建字典樹

子陣列 ch[p][j] 表示從節點 \(p\) 沿著 \(j\) 這條邊走的到子節點。

計數陣列 cnt[p] 表示以節點 \(p\) 結尾得到單詞的插入次數。

節點編號 idx 用來給節點編號。

1.Trie中只有一個根節點,編號為0。

2.從根開始插入,列舉字串的所有字元。

​ 如果有兒子,那麼直接走到兒子。

​ 反之,先建立兒子,再走到兒子。

3.維護計數陣列。

int ch[N][26],cnt[N],idx;
void insert(string s){
	int p=0;
	for(auto c:s){
		int j=c-'a';
		if(!ch[p][j]) ch[p][j]=++idx;
		p=ch[p][j];
	}
	cnt[p]++;
}
int query(string s){
	int p=0;
	for(auto c:s){
		int j=c-'a';
		if(!ch[p][j]) return 0;
		p=ch[p][j];
	}
	return cnt[p];
}

相關文章