[发明专利]基于有序二叉树的模式匹配方法无效
申请号: | 200810203008.2 | 申请日: | 2008-11-20 |
公开(公告)号: | CN101425084A | 公开(公告)日: | 2009-05-06 |
发明(设计)人: | 刘功申;胡佩华;王士林 | 申请(专利权)人: | 上海交通大学 |
主分类号: | G06F17/30 | 分类号: | G06F17/30 |
代理公司: | 上海交达专利事务所 | 代理人: | 王锡麟;王桂忠 |
地址: | 200240*** | 国省代码: | 上海;31 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 有序 二叉 模式 匹配 方法 | ||
技术领域
本发明涉及的是一种信息技术领域的方法,具体是一种基于有序二叉树的模式匹配方法。
背景技术
在信息技术领域,如何在一个动态字符串中定位指定的模式串是一个非常典型的问题。该技术的应用范围非常广泛,例如,信息抽取、文本编辑、恶意代码查找、DNA序列匹配等等。当前,基于普通树型结构的有限状态自动机(DFSA,Deterministic Finite State Automaton)方法是解决多模式匹配问题的常用方法。基于树型结构的有限自动机在应用程序中构造一次,就可以随时在应用程序中使用,应用非常广泛。在实际应用中,有一些新的问题逐渐受到重视。在线更新的模式串集合查找的需求(实现编辑软件中多字符串的查找和替换功能);内存节约的需求(使方法方便应用于PDA、潜入式系统软件等);同时要求匹配速度不能降低。然而基于树型结构的有限自动机由于构造速度慢、内存空间耗费大的缺点,不能很好地满足这些要求。
经对现有技术文献的检索发现,论文:Efficient string matching:An aidto bibliographic search(高效字符串匹配方法:目录查找的辅助手段),引文出处:Communications of the ACM,1975,18(6):333-340(ACM通讯,1975年,18卷,6期,333-340页)。该文献是多模式匹配的奠基,其核心方法是基于普通树型结构的有限状态自动机(DFSA)方法,该方法是解决多模式匹配问题的常用方法。DFSA方法在匹配前对模式串集合进行预处理,转换成树型有限状态自动机,然后只需对文本串进行一次扫描就可找出所有模式串,其查找时间复杂度是0(n)。但该方法的不足之处在于:基于树型结构的有限自动机特别适用于模式串集合相对稳定的情况,例如,词典是一个相对稳定的模式串集合,只需在应用程序中构造一次,就可以随时在应用程序中使用。
经检索还发现,An efficient algorithm for match multiple patterns(匹配多模式串的高效方法),IEEE Transaction on Knowledge and Data Engineering,1993,5(2):339-351(IEEE知识和数据工程通讯,1993年,5卷,2期,339-351页)。该文献在经典DFSA方法的基础上增加了跳跃式查找的思想,也可以简单理解为DFSA和经典BM单模式匹配方法的结合。由此可知,该技术根本没有改变DFSA方法。
发明内容
本发明的目的在于克服上述现有技术的不足,提供了一个基于有序二叉树的模式匹配方法,使其能够经过一次扫描源字符串就能够定位多个不同模式串在源字符串中的位置。本发明改变了传统DFSA方法,提高了构造速度;提高了查找速度;支持动态增删模式串;不需要额外的转向、失败和输出表示。
本发明是通过以下技术方案实现的,本发明包括如下步骤:
步骤一、构造有序二叉树:对二叉树按NLR(Node-Left-Right,前序遍历)方式遍历,设定遍历二叉树时的顺序,得到一系列的模式串,如果这些模式串得到的先后顺序和它们的字典序相同,即获得有序二叉树,同时在有序二叉树上构造出失败指针,以重复利用已经匹配成功的模式串子串信息;
步骤二、查找阶段:根据构造的有序二叉树及goto函数和失败指针对源字串进行一次查找,定位出模式串在源字串中的精确位置,查找的过程如下:从有序二叉树的根节点出发,逐个取出源字串中的字符,根据goto函数和失败指针确定状态之间的转换,当源字串的所有字符都被取出后,查找过程就结束。
所述的设定遍历二叉树时的顺序,具体如下:设置栈s用来存放模式串,指针p用来跟踪节点,当指针p指向当前节点的右子树时,栈s的栈顶元素出栈,右子树上的元素入栈;当指针p指向当前节点的左子树时,左子树上的元素直接入栈,重复上述过程直到p指向叶子节点,此时,栈内的元素就是某一个模式串。
所述的失败指针,是指为了重复利用已经匹配成功的子字串信息而使用的一种指针,具体是指:在有序二叉树的某个状态s1时,应用goto函数将达到一个新的状态,如果goto函数调用正确,则到达状态s1某一个子状态节点,如果调用错误,则由失败指针指向一个固定的节点状态,以避免重新回到根节点重新匹配,合理利用了已经成功匹配的子字串信息,从而就节约了查找阶段的时间。
所述失败指针,其构造方式具体如下:
(1)根节点的失败指针指向根节点;
(2)状态深度为1的节点的失败指针指向根节点;
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于上海交通大学,未经上海交通大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/200810203008.2/2.html,转载请声明来源钻瓜专利网。