文章目录

  • 简介
  • 字典树Trie
  • 压缩字典树
  • 后缀树Suffix Tree
  • 后缀树的搜索
  • 查找最长重复子字符串
  • 查找两个字符串的最长公共子字符串
  • 后缀树的代码实现

简介

模式匹配是一个在工作中经常会用到的场景,比如说给定一个字符串数组txt[0…n-1]和要匹配的模式pat[0…m-1],我们希望找出所有在txt中能够匹配模式字符串的次数。这就叫做模式匹配。

要想完成字符串匹配的任务,我们其实有两种方式,第一种方式就是使用各种模式匹配的算法,比如KMP,Rabin Karp,Finite Automata based和Boyer Moore。 这些匹配算法最好的时间复杂度是O(n),其中n是字符串的长度 。

还有一种方式是对要查询的字符串数组进行预处理,处理过后再进行匹配的话,时间复杂度可以减少到O(m),其中m是要匹配的模式的长度。

实际上这就是空间换时间的概念,假如我们有一本康熙字典,即使是O(n)的时间复杂度也住够长了,如果能够进行预处理之后,O(m)的时间复杂度将会大大减少我们的搜索时间。

那么是不是所有的字符串的模式匹配都可以使用预处理呢?

当然不是,因为预处理是需要耗费时间的,预处理的情况只适用于一次

看动画学算法系列之:后缀树suffix tree相关推荐

  1. 看动画学算法系列之:后缀数组suffix array

    文章目录 简介 后缀数组的定义 后缀数组的创建流程 在后缀数组中查找某个字符串 创建LCP 后缀数组和后缀树的比较 简介 在之前的文章中,我们讲到了后缀树和它的一些特性.后缀树主要用来做模式匹配中,比 ...

  2. 看动画学算法之:二叉搜索树BST

    文章目录 简介 BST的基本性质 BST的构建 BST的搜索 BST的插入 BST的删除 看动画学算法之:二叉搜索树BST 简介 树是类似于链表的数据结构,和链表的线性结构不同的是,树是具有层次结构的 ...

  3. 看动画学算法之:排序-基数排序

    文章目录 简介 基数排序的例子 基数排序的java代码实现 基数排序的时间复杂度 简介 之前的文章我们讲了count排序,但是count排序有个限制,因为count数组是有限的,如果数组中的元素范围过 ...

  4. c++排序数组下标_看动画学算法之:排序 - 基数排序

    简介 之前的文章我们讲了count排序,但是count排序有个限制,因为count数组是有限的,如果数组中的元素范围过大,使用count排序是不现实的,其时间复杂度会膨胀. 而解决大范围的元素排序的办 ...

  5. 后缀树 Suffix Tree

    今天看到一个很神奇的字符串搜索的算法--后缀树,之前真是孤陋寡闻啊.而且后缀树的资料好像还不那么多,讲的也不完全清楚,搜索再三,发现了一些讲得比较清楚的文章: 1. 关于后缀树:http://blog ...

  6. 看动画学算法之:递归和递归树

    文章目录 简介 递归树和阶乘 斐波那契数列 GCD最大公约数 N中选K 0-1背包问题 硬币找零问题 数组的最长递增子序列 旅行商问题 简介 在之前我们介绍的很多数据结构和算法都用到了递归,递归非常容 ...

  7. 看动画学算法之:线段树-segmentTree

    文章目录 简介 最小线段树 线段树的构建 线段树的搜索 线段树的更新 线段树的复杂度 简介 什么是线段树呢?线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树 ...

  8. java 插入排序_看动画学算法之:排序-插入排序

    简介 插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组. 这个算法就叫做插入排序. 插入排序的例子 同样的,假如我们有一个数组:29,10,14,37,20,25,44, ...

  9. 冒泡排序java代码_看动画学算法之:排序冒泡排序

    点击上方的蓝字关注我吧 程序那些事 简介 排序可能是所有的算法中最最基础和最最常用的了.排序是一个非常经典的问题,它以一定的顺序对一个数组(或一个列表)中的项进行重新排序. 排序算法有很多种,每个都有 ...

最新文章

  1. 没有安装python如何使用anaconda运行python命令行
  2. Hibernate4.x之Session
  3. Ubuntu 里的Spyder不能切换中文输入
  4. win32创建控件的一些问题
  5. C#——Circle(圆)类
  6. java 面试题三十三 子类父类方法执行顺序的问题
  7. “chaos“的算法--之双向链表
  8. 【PMP】项目风险管理~重点知识
  9. asp.net中RegularExpressionValidator控件中正则表达式用法
  10. ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)
  11. oracle 运营维护_总结几个ORACLE数据库日常运维常用的命令(持续更新)
  12. Linux实时查看日志,访问前10IP 和相关命令
  13. 可以出题的答题小程序
  14. (二)大话深度学习编译器中的自动调优·DSL与IR
  15. Windows 11 新功能 Microsoft Teams
  16. 【飞桨】GAN:U-GAT-IT【2020 ICLR】论文研读
  17. 基于教学优化算法(TLBO)求解TSP问题 (Matlab代码实现)
  18. python教程 廖雪_Python 2.7教程
  19. Jekins构建触发器Build Triggers:定时构建配置
  20. (LeetCode)Java 求解无重复字符的最长子串

热门文章

  1. Pandas条件筛选 | Python技能树征题
  2. TIS教程01-安装
  3. TensorFlow2-神经网络训练
  4. 数据科学竞赛-计算机视觉赛流程
  5. 互联网常识(持续更新)
  6. lpt算法c语言程序,LPT算法的性能(近似).ppt
  7. Lua 文件 I/O
  8. sockaddr与sockaddr_in的区别
  9. 白话科普,10s 了解 API
  10. 高级数据结构与算法 | 并查集(Union-Find)