后缀树(Suffix Trie)子串匹配结构

Suffix Trie                                                                           

又称后缀Trie或后缀树。它与Trie树的最大不同在于,后缀Trie的字符串集合是由指定字符串的后缀子串构成的。比如、完整字符串"minimize"的后缀子串组成的集合S分别如下:

         s1=minimize

         s2=inimize

         s3=nimize

         s4=imize

         s5=mize

         s6=ize

         s7=ze

         s8=e

      然后把这些子串的公共前缀作为内部结点构成一棵"minimize"的后缀树,如图所示,其中上图是Trie树的字符表示,下图是压缩表示。可见Suffic Trie是一种很适合操作字符串子串的数据结构。 它和PAT tree在这一点上类似。

1

Suffix Trie的创建                                                                    

标准Tire树的每一个内部结点只有一个字符,也就是说公共前缀每一次只找一个。而Suffix Trie的公共前缀可以是多个字符,因此在创建Suffix Trie的时候,每插入一个后缀子串,就可能对内部结点造成一次分类。下面我们我们看一种后缀树构造算法。以"minimize"为例:

1

当插入子串时,发现叶子结点中的关键字与子串有公共前缀,则需要将该叶子结点分裂。如上图第3到4步。否则,重新创建一个叶子结点来存放后缀,如上图第1到2步。

Suffix Trie的子串查询                                                               

如果在后缀树T中查找子串P,我们需要这样的过程:

     (1) 从根结点root出发,遍历所有的根的孩子结点:N1,N2,N3....

     (2) 如果所有孩子结点中的关键字的第一个字符都和P的第一个字符不匹配,则没有这个子串,查找结束。

     (3) 假如N3结点的关键字K3第一个字符与P的相同,则匹配K3和P。

          若 K3.length>=P.length  并且K3.subString(0,P.length-1)=P,则匹配成功,否则匹配失败。

         若 K3.length<=P.length  并且K3=P.subString(0, K3.length-1),则将子串P1=P.subString(K3.length, P.length); 即取出P中排除K3之后的子串。然后P1以N3为根结点继续重复(1)~(3)的步骤。直到匹配完P1的所有字符,则匹配成功。否则匹配失败。

查询效率:很显然,在上面的算法中。匹配成功正好比较了P.length次字符。而定位结点的孩子指针,和Trie情况类似,假如字母表数量为d。则查询效率为O(d*m),实际上,d是固定常数,如果使用Hash表直接定位,则d=1.

因此,后缀树查询子串P的时间复杂度为O(m),其中m为P的长度。

Suffix Trie的应用                                                                    

标准Trie树只适合前缀匹配和全字匹配,并不适合后缀和子串匹配。而后缀树在这方面则非常合适。

另外后缀树也可以进行前缀匹配。 如果模式串P是字符串S的前缀的话,那么从根结点出发遍历后缀树,一定能够寻找到一条路径完全匹配完P。比如上图: 模式串P=“mini”,主串S="minimize"。P从根节点出发,首先匹配到结点mi,然后再匹配孩子结点nimize。直到P中所有的字符都找到为止。所以P是S的前缀。

我是天王盖地虎的分割线                                                             

 

 

参考:http://hxraid.iteye.com/blog/620414

转载于:https://www.cnblogs.com/yydcdut/p/3919235.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399100.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中的线程和进程,Java | 线程和进程,创建线程

一、线程与进程线程定义进程中执行的一个代码段&#xff0c;来完成不同的任务组成&#xff1a;线程ID&#xff0c;当前指令指针(PC)&#xff0c;寄存器集合(存储一部分正在执行线程的处理器状态的值)和堆栈进程定义执行的一段程序&#xff0c;一旦程序被载入到内存中准备执行就…

Maven的pom报错的解决方法

如果在MyEclipse里面导入项目,导入不了,如下图 接下来可以点击Import Maven Projects里的Action那一行Resolve Later. 点击Do Not Execute(add to pom)就可以正常导入了转载于:https://www.cnblogs.com/JimmySeraph/p/8068299.html

django零开始

2019独角兽企业重金招聘Python工程师标准>>> 安装。。。后查看 import django django.VERSION #输出版本号&#xff0c;目前自己是py2.7.9和django1.8 1&#xff0c;新建一个django-project django-admin.py startproject project-name 一个project一般为一个项目 …

php 大批量的删除图片,PHP批量删除记录同时删除图片文件

非常感谢老师的回答&#xff1a;全选&#xff0c;反选。已完成。可是PHP批量删除记录同时删除文件。代码不知怎么弄。请您给我代码好吗&#xff1f;if (!function_exists("GetSQLValueString")) {function GetSQLValueString($theValue, $theType, $theDefinedValue …

关于Python3.6下登陆接口的尝试

编者按&#xff1a;README:此代码为用户登陆界面&#xff0c;添加了寻求帮助选项。1.学习了基本数据类型&#xff0c;string, int&#xff0c;以及while循环&#xff0c;continue, break, if, elif, else条件语句&#xff0c;“x".format&#xff08;x&#xff09;变量替代…

堆溢出的DWORD Shoot核心原理-口语化

1、双向链表上有a、b、c一共3个连续的堆块&#xff0c;a、b、c三者之间的实际物理地址可能相差很大&#xff0c;但是绝对不会三者之间无其他字节&#xff0c;如果无其他字节&#xff0c;那表示他们三个可以合并成一个物理连接起来的大块&#xff0c;堆管理系统很快会让他们三者…

* 类描写叙述:字符串工具类 类名称:String_U

/******************************************* 类描写叙述&#xff1a;字符串工具类 类名称&#xff1a;String_U* ******************************************/public class String_U {private String_U() {}/*** 检查手机号是否合法* * param phoneNum* return boolean tru…

git 撤销 merging

当我们在合代码的时候经常会遇到一些问题&#xff0c;这时候分支就处于merging状态&#xff0c;这时候可以用下面的命令撤销$ git reset --hard HEAD (or sha_1) 不知道有没有更好的办法&#xff0c;希望大家能给出自己的办法 转载于:https://www.cnblogs.com/WangHaiMing/p/80…

php 命令安装tp5,tp5.1框架的下载与安装方法步骤(图文)

大家可以都知道啊&#xff0c;tp框架5.1之前的版本都是可以在thinkphp的官网进行下载压缩包来安装框架的&#xff0c;那么在从tp5.1开始啊&#xff0c;就取消了下载压缩包安装的方法&#xff0c;那么我们如何进行下载呢&#xff1f;tp5.1的手册中开始就有提到tp5.1框架有两种安…

[连载]《C#通讯(串口和网络)框架的设计与实现》- 13.中英文版本切换设计

目 录 第十三章 中英文版本切换设计... 2 13.1 不用自带的资源文件的理由... 2 13.2 配置文件... 2 13.3 语言管理类... 3 13.4 应用管理类... 12 13.5 小结... 12 第十三章 中英文版本切换设计 13.1 不用自带的资源文件…

【JavaScript】apply和call的区别在哪?

我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这里我做如下笔记,希望和大家分享.. 如有什么不对的或者说法不明确的地方希望读者多多提一些意见,以便共同提高.. 主要我是要解…

php js动态显示系统时间,PHP+JS动态显示服务器时间

摘要&#xff1a;JS默认只能获取当前系统时间&#xff0c;若想获取服务器时间&#xff0c;必须加上后端语言配合&#xff0c;PHPJS获取服务器端时间代码&#xff1a;运行结果&#xff1a;2017-4-4 15:...JS默认只能获取当前系统时间&#xff0c;若想获取服务器时间&#xff0c;…

SQL中的事物【转】

来源于&#xff1a;http://www.cnblogs.com/zhuifengnianshao/archive/2010/11/24/1886939.html事务&#xff08;Transaction&#xff09;是并发控制的单位&#xff0c;是用户定义的一个操作序列。这些操作要么都做&#xff0c;要么都不做&#xff0c;是一个不可分割的工作单位…

Mybaitis JdbcType 和javaType

2019独角兽企业重金招聘Python工程师标准>>> MyBatis 通过包含的jdbcType类型 BIT FLOAT CHAR TIMESTAMP OTHER UNDEFINEDTINYINT REAL VARCHAR BINARY BLOB NVARCHARSMALLINT DOUBLE …

装箱和拆箱(js的问题)

装箱&#xff1a;基本数据类型 -> 引用数据类型 var num 123; var numObj new Number(123);console.log(typeof num) // number console.log(typeof numObj) // object 拆箱&#xff1a;引用数据类型 -> 基本数据类型 var numObj new Number(123);console.log(numO…

php文件缓存代码,php文件缓存实例代码

php教程文件缓存实例代码缓存在实际使用当中应用很广泛&#xff0c;可以减轻对服务器数据库教程的访问&#xff0c;提高运行速度。目前很多cms内容管理系统中频繁使用缓存机制来提高系统运行的效率cache.php 代码如下&#xff1a;php代码/*用户需要事先定义的常量&#xff1a;_…

[架构] 分布式和集群的区别

一次在群里面看到群友们在讨论这个的区别&#xff0c;看了他们发表的言论&#xff0c;觉得很有道理&#xff0c;很通俗易懂&#xff0c;就当做学习的笔记记录在这里&#xff1a; 用两个例子看清楚分布式和集群的区别&#xff1a; 例子1&#xff1a; 如果一个任务由10个子任务组…

JQuery.lazyload 图片延迟加载

1.引入 jquery.lazyload.js 2. 延时加载的方式 <script type"text/javascript">   $(function() {     $("img").lazyload({     effect : "fadeIn"    });   });   </script> 3. 把阀值设置成200 意思就是当图…

如何把UIView转成UIImage,解决模糊失真问题

最近工作中&#xff0c;遇到一个需求&#xff0c;需要把一个UIView对象转成UIImage对象显示。经过网络搜索&#xff0c;找到如下答案&#xff1a; ?12345678-(UIImage*)convertViewToImage:(UIView*)v{CGSize s v.bounds.size;UIGraphicsBeginImageContext(s);[v.layer rende…

php数据趋势曲线,数据曲线图怎么做

数据曲线图怎么做&#xff1f;1、在电脑桌面上&#xff0c;新建一个excel文件(操作过程即为点击右键&#xff0c;在选项中选择“新建”选项&#xff0c;然后再选择“excel文件”&#xff0c;即可成功新建excel文件了)2、双击将新建的excel文件打开&#xff0c;输入你需要统计制…