Trie 樹學習筆記

2022-09-19 18:27:11 字數 1848 閱讀 1231

trie 樹是一種能夠高效的儲存和使用字串集合的一種東西。

它的作用跟 \(\texttt\) 十分相似,都是用來儲存字串集合的利器,但是,trie 樹卻比 \(\texttt\) 的時間複雜度更加優秀。詳情見時空複雜度分析。

trie 樹究竟是什麼東西呢?讓我們通過儲存乙個字串集合來直觀的了解它。

已知我們要儲存這樣的字串集合:

abcd

abfg

aifff

那麼我們乙個乙個的來儲存,第乙個儲存時,trie 樹是這樣的:

可以看出,trie 樹的儲存實質上是建立在一棵樹上,我們可以建立乙個虛點為整棵樹的根節點,然後再建立每個節點。然後建立第二個字串:

我們可以發現,abfg的前面兩個字元ab跟第乙個字串的和在一起了,這就是它省空間的秘訣:相同的字元可以和在一起。

然後再加入最後乙個字串,效果如下:

儲存的原理就講到這,接下來我們講查詢。

那個 \(\color\) 就有大用處了。

此時,假設我們查詢的字串為abfg,我們要查詢它是否存在。

此時我們的查詢過程如下:

此時我們到最後一定要確定是否有標記,否則當乙個查詢字串是現有字串字首的時候就會出錯。

這裡給出的是一道題的模板,可以學習一下我的 trie 樹風格,別問我,我跟 \(yxc\) 學的(\(acwing\) 的大老總)。

這裡以 \(\color\texttt\)

為例,講一下模板**。

插入部分:

void i(string s)

p = son[p][u]; // 類似遞迴

} v[p] = true; //v 用來打標記

}

查詢部分:

bool q(string s)

p = son[p][u]; // 遞迴

} return v[p]; // 如果這個字串有,返回 true,否則返回 false

}

是不是感覺很好打。

作者建議:深度理解**後,打模板** \(3\) 到 \(5\) 遍,就基本可以掌握了。

我們可以發現,在最壞的時候,我們要建立的節點數為所有字串的長度之和,所以定義 \(l\) 為所有字串的長度之和,那麼建立 trie 樹的時間複雜度是 \(o(l)\) 的。

那麼同樣可以推出,在詢問時,時間複雜度是查詢的字串長度(也可能比這個小)。

在這裡推薦一道很好的題目:\(\color\texttt\)

。這道題的做法就是,用 trie 樹對排完位的座位進行標號,最後再去求逆序對數列就行了。

逆序對可以用兩個東西求:

樹狀陣列。

歸併排序。

本部落格就講到這裡,拜拜!

學習筆記 字典樹(Trie)

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

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

2.3 trie 樹的適用範圍 3.總結 trie 樹,中文名為字典樹,是一種字串的高效處理演算法。trie 樹實現的功能就是快速的查詢一堆字串裡面有沒有某個串是另乙個串的字首,字尾等等。trie 樹首先是一棵樹,比如下面這棵樹就是一棵 trie 樹。這棵樹是由ab,abd,ac,bd四個字串構成的...

筆記整合 Trie樹

trie樹,也叫 字典樹 顧名思義,它是乙個樹形結構。它是一種專門處理字串匹配的資料結構,用來解決在一組字串集合中快速查詢某個字串的問題。trie樹到底長什麼樣子?比如有6個字串,它們分別是 how,hi,her,hello,so,see。希望在裡面多次查詢某個字串是否存在。如果每次查詢,都是拿要查...