字符串中的快速模式匹配1977
作者:DONALD E.KNUTH,JAMES H,MORRIS,JR.VAUGHAN R.PRATTY 发表时间:1977
摘要:这是一个在一个字符串中找到另一个给定字符串所有事件的算法,运行时间与两个字符串长度之和成比例。其中比例系数很小,小到算法可以在实际中应用,并且这个过程可以推广到解决其他一般的模式匹配问题。该算法的一个理论应用表明即使是回文集合({αα^R})也可以在线性时间内识别出来。还考虑了平均更快运行的其他算法。
关键词:模式,字符串,文本编辑,模式匹配,字典树存储,搜索,字符串周期,回文,最佳算法,斐波那契字符串,正则表达式。
文本编辑程序经常会需要搜索一个给定的“模式”字符串的实例;我们希望找到它出现的所有位置,或者可能只需要找到最左边的那个位置,这里模式在文本中以相邻的子串出现。比如:"catenary"包括模式"ten"但是我们不把"caary"看成是一个子串。
搜索一个匹配模式的最明显的方法就是每次都从文本的开头位置搜索,找都一个错误匹配就删掉。但是这个方法可能非常低效,举个例子,我们要在"aaaaaaaaaaaaaab"总查找"aaaaaaab",匹配模式是a^nb而文本是a^(2n)b格式的,我们就需要做(n+1)^2次字符比较。除此之外,传统的方法还涉及到丢掉的那些文本字符的“备份”问题,当我们又要考虑频繁的进行缓冲操作时,就会使问题非常的复杂化。
在这篇论文中,我们描述了一种在长度为n的文本中查找长度为m的所有出现事件的算法,只需要花费O(m+n)单元时间,不涉及到输入文本的“备份”问题。如果文本是从外部读入的文件,那么这个算法只需要占用O(m)个内存位置和在连续的单个字符输入消耗的O(log m)单元时间。所有的比例变量使用独立于字母表大小的“O”公式表示。
首先我们使用概念性的简单并且低效的形式介绍一下这个算法。论文的第3、4部分会讨论提高效率的方法以及如何应用算法去解决其他问题。第5部分会介绍算法的理论,第6部分会使用算法推翻某些上下文无关语言不能在线性时间内被识别的推测。第7部分会讨论算法的起源以及它和其他当前研究的关系。最后,第8部分关于模式匹配更多的当前问题。
第一部分:01
第二部分:02