字典树

本文详细阐述了Trie数据结构的概念、实现方法及其在字符串处理中的应用,包括单词计数、自动填表、多模字符串匹配等场景。通过实例分析,展示了Trie在工程代码中的高效性及与其他数据结构的比较。最后,提供了练习题以加深理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string标准库固然强大,但是仍然有一些处理字符串的优秀数据结构。Trie(前缀树)就是其中之一,它通过在树上对不同字符串的相同字符只记录一次,来实现对多个字符串的"压缩":可以认为多个字符串被压成了一个超级大的字符串。

 

int ch[10000][26],cnt[10000];
int sz=1; //当前结点
void Insert(string str,int id)
{
    int u=0,c;
    for(int i=0;i<str.size();i++)
    {
        c=str[i]-'a';
        if(!ch[u][c]) ch[u][c]=sz++;
        u=ch[u][c];
    }
    cnt[u]=id;
}
bool Query(string str)
{
    int u=0,c;
    for(int i=0;i<str.size();i++)
    {
        c=str[i]-'a';
        if(!ch[u][c]) return false;
        u=ch[u][c];
    }
    if(!cnt[u]) return false;
    else return true;
}
字典树的insert与query

 

对每个字符串的结尾做个标记极其必要的,标记即为id号,便于从整个trie重建字符串组。Trie在工程代码中很常用,以上代码采用数组实现,不太适合工程代码。

Trie查找一个字符串是迅捷的,O(字符串长度),如果用红黑树配合string存字符串组,那么最好也才O(logn),  在字符串组极其庞大的情况下,红黑树无疑太过劣势。

Trie可用于单词计数,不过没啥优势。

Trie可用于自动填表,比如输入ac后,立刻判断c后面的后接情况,自动列出acm。这里吐槽一下如何做个Top10热点词的自动填表,定期 Update即可:每次Update,首先从0点开始逐点BFS,拿到一个字符后,对其DFS,递归记录返回所有词,和词频,将以这个字符结尾的所有词和 词频压入一个vector,排序,取Top10储存。

Trie可用于多模字符串匹配(AC自动机)。

 

@练习题

POJ 1056 ,依次存入一堆字符串。问是否能确保任一字符串不成为另一字符串的前缀。insert之前对于这个str前n个字符依次query,while走完所有字符后。 if(cnt[u])就代表发现前缀了。

 

转载于:https://www.cnblogs.com/neopenx/p/4004382.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值