树一周小结 树的学习

树的一周中,学习了字典树,线段树,ac自动机

1.字典树是这三种树中最简单的一种树,比如这个树就是字典树的建立,b,abc,等红色的点就是一个字符串的结束,字典树的建立,就像这个树的名字一样,为了查询一个字符串在不在这个树中,可以快苏的查询到。

每一个字母都有26个后缀节点,代表26个字母,建树的时候如果存在这个字母就继续往下不存在就建立上,还要有一个数表示是不是字符串的结束,如下代码

typedef struct TrieNode
{
     int nCount;//记录该字符出现次数
     struct TrieNode* next[26];
int k=0;//k代表是否是一个字符串的结尾
}TrieNode;
http://blog.csdn.net/clx55555/article/details/52806055有一个例题。

2.线段树
线段树就比较复杂一点
线段树是用来查询更新区间内的数,更快。

1.建树的时候分左儿子,右儿子,根节点是【l,r】,左儿子是【l,(l+r)>>1】,右儿子是【(r+l)>>1|1,r】如果l==r输入值,根节点的和是左儿子加上右儿子

2.改变值的时候是如果是(ll,rr)的值都加1,p左儿子的右节点r大于ll,递归p的左儿子,p的右儿子左节点小于rr就递归p的右儿子,p的和等于他俩儿子的和
如果节点的l==r就改变值
总体意思就是只要有某个节点的范围和(ll,rr)有交集就改变值

3.查询原理和改变值得原理差不多,模板加例题:

http://blog.csdn.net/clx55555/article/details/52824244

3。ac自动机

ac自动机的用途:用来查询一个子串在一篇非常长的文件中出现的次数。哇咔咔,开始想用线段树,果断不行。

好难好难得一个题,我来说下大概思路,这个最好要有kmp的基础,不然好难理解,,和kmp类似如果不能匹配就转到next【】,这个next【】使用指针表示可以转到其他的字符串。继续查询,如果都不匹配就开始查询下一个子串


要搞懂AC自动机,先得有模式树( 字典树)Trie和 KMP模式匹配算法的基础知识。AC自动机算法分为3步:构造一棵 Trie树,构造失败 指针和模式匹配过程。
如果你对KMP算法了解的话,应该知道KMP算法中的next函数(shift函数或者fail函数)是干什么用的。KMP中我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。同样AC自动机的失败 指针具有同样的功能,也就是说当我们的模式串在Trie上进行匹配时,如果与当前节点的关键字不能继续匹配,就应该去当前节点的失败指针所指向的节点继续进行匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值