Trie 树

Trie 树

Trie 树是一种可以快速查找一个字符串是不是在目前集合中的一个数据结构。

Trie 树的中文名是字典树,顾名思义,这个数据结构就是一个长得像字典的树。

思路

By

上面这个图就是一个 Trie 树,这种树是一个有根树。这种数据结构中,我们不再把每个字符串完全分开存储,而是把相同的合并了。

插入

我们从根节点开始,检查根节点的边有没有符合字符串的,如果没有,就新建一条边。然后,从那条边连接的点开始,重复以上操作,就完成了

查找

和插入类似,从根节点开始查找,如果发现没有对应的边,那么就肯定是没有了。

代码

image

#include <bits/stdc++.h>

using namespace std;
/*
*/
int n;
string s[10005];
int tr[1000005][30];
int cnt=  0;
void insert(string s) {
    int p = 0;
    for (char ch : s) {

        if (tr[p][ch - 'A'] <= 0) {
            tr[p][ch - 'A'] = ++ cnt;
        }
        // cout << ch << " " << s << " " << p << " " << cnt << " " << tr[p][ch - 'A'] << "\n";
        // cout << p << '\n';
        p = tr[p][ch - 'A'];
    }
}
int maxn = -1e9;
void dfs(int nw, int dep) {
    if (nw == -1) {
        maxn = max(dep, maxn);
        return;
    }
    // cout << nw << " " << dep << "\n";
    for (int i = 0; i <= 26; i ++) {
        // if (tr[nw][i]) {
            dfs(tr[nw][i], dep + 1);
        // }
    }

}
int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    memset(tr, -1, sizeof(tr));
    while (cin >> s[n + 1]) n ++;
    for (int i = 1; i <= n; i ++) {
        s[i] = char('A' + 27) + s[i];
        insert(s[i]);
    }
    cout << cnt;
    return 0;
}
本文链接:https://ztrztr.top/archives/717
版权声明:本文 《Trie 树》 为 ztrztr 原创。著作权归作者所有。
转载说明:联系作者或者评论区留言获得转载授权,并注明转载地址。
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇