1Trie树
这节课学习了一种特殊的树,Trie树。Trie树是一种解决字符串快速匹配问题的数据结构。如果用来构建Trie树的这一组字符串中,前缀重复的情况并不是很多,那Trie树这种数据结构总体上来讲是比较费内存的,是一种空间换时间的解决问题思路。
尽管比较耗费内存,但是对内存不敏感或者内存消耗在接受范围内的情况下,在Trie树中做字符串匹配还是非常高效的,时间复杂度是O(k),k表示要匹配的字符串的长度。
但是,Trie树的优势并不在于,用它来做动态集合数据的查找,因为这个工作完全可以由更加合适的散列表或者红黑树来替代。Trie树最有优势的是查找前缀匹配的字符串,比如搜索引擎中的关键词提示功能这个场景,就比较适合用它来解决,也是Trie树比较经典的应用场景。
2AC自动机
这节课学习了多模式串匹配算法,AC自动机。单模式串匹配算法是为了快速在主串中查找一个模式串,而多模式串匹配算法是为了快速在主串中查找多个模式串。
AC自动机是基于Trie树的一种改进算法,它跟Trie树的关系,就像单模式串中KMP算法和BF算法的关系一样。KMP算法中有一个非常关键的next数组,类比到AC自动机中就是失败指针。而且,AC自动机失败指针的构建过程,跟KMP算法中计算next数组极其相似。所以,要理解AC自动机,最好先掌握KMP算法,因为AC自动机其实就是KMP算法在多模式串上的改造。
整个AC自动机算法包含两个部分:第一部分是将多个模式串构建成AC自动机,第二部分是在AC自动机中匹配子串。第一部分又分为两个小的步骤,一个是将模式串构建成Trie树,另一个是在Trie树上构建失败指针。