热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

后缀自动机入门/基本概念

教程链接(本文为适应自己的理解,对原文做出删改,建议到原文学习)后缀自动机可以干啥?后缀自动机࿰

教程链接
(本文为适应自己的理解,对原文做出删改,建议到原文学习)

后缀自动机可以干啥?

后缀自动机(SAM)可以解决许多字符串相关问题。是一个特别nb的数据结构。它可以:

1.在另一个字符串中搜索一个字符串的所有出现位置。
2.计算给定的字符串中有多少个不同的子串。


SAM是啥?

》》SAM是一个有向无环图。节点被称为状态,边就是状态之间的转移
》》图存在一个源点t0t_0t0 ,称作 初始状态 ,其它各结点均可从 出发到达。
》》每个边上表示一个字母,类似边权,从一个节点出发的所有边字母都不同。
》》存在终止状态 。如果我们从t0t_0t0 出发,最终转移到了一个终止状态,则路径上的所有转移连接起来一定是字符串的一个后缀。 字符串的每个后缀均可用一条从t0t_0t0到某个终止状态的路径构成。
》》最后以最少的节点构成上述的数据结构,我们就得到了一个后缀自动机。

SAM记录了字符串的所有子串信息,SAM上的任意一个从t0t_0t0出发的路径都是它的子串,每个子串都在SAM上找到一个对应路径。

构造SAM?

参考原教程图示即可理解。(做图太麻烦 )

我们引入endpos(t)endpos(t)endpos(t)为字符串中t出现的位置。如:“abcbc” 我们有endpos(“bc”)=2,4endpos(“bc”) =2, 4endpos(bc)=2,4
如果两个不同子串的endposendposendpos可能相等,我们把他们归为一个等价类。我们把这些等价类数量累计,然后+1,就是这个SAM的总状态数。我们可以用这个假设构造SAM。
对于这个endposendposendpos我们可以很容易的理解它的几个性质:

如果有两个endpos相同的子串,则存在一个肯定是另一个的后缀。

扩展一下:

如果有两个子串u和v&#xff0c;&#xff08;设|u|<&#61;|w|&#xff09;则它们的endpos只有两种情况&#xff1a;
1.endpos(u)∩endpos(w)&#61;∅endpos(u) \cap endpos(w)&#61;\varnothingendpos(u)endpos(w)&#61;
2.endpos(w)⊆endpos(u)endpos(w) \subseteq endpos(u)endpos(w)endpos(u)
这由u是不是w的一个后缀决定。

后缀链接link
我们想象一个SAM的一个非空状态v,我们通过前面的学习&#xff0c;知道了v应该属于某endpos等价类。定义其中最长的一个子串为w。则&#xff0c;等价类其他的字符串都是w的后缀。另外&#xff0c;我们也知道&#xff0c;w的后缀构成的endpos等价类都把w构成的这个等价类包含在内。这时我们设一个w的最长后缀t。令t满足&#xff1a;
endpos(w)⊂endpos(t)endpos(w) \sub endpos(t)endpos(w)endpos(t)
然后将v的后缀链接到t上。一个link(v)link(v)link(v)应该链接到对应于w的最长后缀的另一个endpos等价类的状态。则这些链接构成一棵树。
图示见原教程


推荐阅读
  • 提升Python编程效率的十点建议
    本文介绍了提升Python编程效率的十点建议,包括不使用分号、选择合适的代码编辑器、遵循Python代码规范等。这些建议可以帮助开发者节省时间,提高编程效率。同时,还提供了相关参考链接供读者深入学习。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 热血合击脚本辅助工具及随机数生成器源码分享
    本文分享了一个热血合击脚本辅助工具及随机数生成器源码。游戏脚本能够实现类似真实玩家的操作,但信息量有限且操作不可控。热血合击脚本辅助工具可以帮助玩家自动刷图、换图拉怪等操作,并提供了雷电云手机的扩展服务。此外,还介绍了使用mt_rand函数作为随机数生成器的代码示例。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 这篇文章主要讲解了“怎么用Python写一个电信客户流失预测模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入, ... [详细]
author-avatar
霸气的萱---_299
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有