您的位置:首页 > 其它

树一周小结 树的学习

2016-10-24 12:25 239 查看
树的一周中,学习了字典树,线段树,ac自动机

1.字典树是这三种树中最简单的一种树,

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

每一个字母都有26个后缀节点,代表26个字母,建树的时候如果存在这个字母就继续往下不存在就建立上,还要有一个数表示是不是字符串的结束,如下代码
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上进行匹配时,如果与当前节点的关键字不能继续匹配,就应该去当前节点的失败指针所指向的节点继续进行匹配。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: