字符串匹配算法的研究_本科论文

合集下载

字符串的模式匹配算法

字符串的模式匹配算法

在前面的图文中,我们讲了“串”这种数据结构,其中有求“子串在主串中的位置”(字符串的模式匹配)这样的算法。

解决这类问题,通常我们的方法是枚举从A串(主串)的什么位置起开始与B串(子串)匹配,然后验证是否匹配。

假设A串长度为n,B串长度为m,那么这种方法的复杂度是O(m*n)的。

虽然很多时候复杂度达不到m*n(验证时只看头一两个字母就发现不匹配了),但是我们有许多“最坏情况”,比如:A=“aaaaaaaaaaaaaaaaaaaaaaaaab”,B=“aaaaaaaab”。

大家可以忍受朴素模式匹配算法(前缀暴力匹配算法)的低效吗?也许可以,也许无所谓。

有三位前辈D.E.Knuth、J.H.Morris、V.R.Pratt发表一个模式匹配算法,最坏情况下是O(m+n),可以大大避免重复遍历的情况,我们把它称之为克努特-莫里斯-普拉特算法,简称KMP算法。

假如,A=“abababaababacb”,B=“ababacb”,我们来看看KMP是怎样工作的。

我们用两个指针i和j分别表示,。

也就是说,i是不断增加的,随着i 的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前j个字符(j当然越大越好),现在需要检验A[i+1]和B[j+1]的关系。

例子:S=“abcdefgab”T=“abcdex”对于要匹配的子串T来说,“abcdex”首字符“a”与后面的串“bcdex”中任意一个字符都不相等。

也就是说,既然“a”不与自己后面的子串中任何一字符相等,那么对于主串S来说,前5位字符分别相等,意味着子串T的首字符“a”不可能与S串的第2到第5位的字符相等。

朴素算法步骤2,3,4,5的判断都是多余,下次的起始位置就是第6个字符。

例子:S=“abcabcabc”T=“abcabx”如果T串后面也含有首字符“a”。

对于开始的判断,前5个字符完全相等,第6个字符不等,此时,根据刚才的经验,T的首字符“a”与T的第二位字符“b”、第三位字符“c”均不等,所以不需要做判断,朴素算法步骤2,3都是多余。

多字符串匹配算法

多字符串匹配算法

多字符串匹配算法多字符串匹配算法是计算机科学中重要的算法之一,用于在一个字符串集合中查找一个或多个目标字符串的出现位置。

这些目标字符串可以是单个的字符,也可以是多个字符组成的字符串。

在实际应用中,多字符串匹配算法具有广泛的应用场景,比如搜索引擎中的关键词匹配、文本编辑器中的查找和替换功能、模式识别中的字符串匹配等等。

它们能够高效地处理大规模的字符串集合,为我们的生活和工作带来了极大的便利。

多字符串匹配算法有许多不同的实现方法,其中最常见的包括暴力匹配算法、KMP算法、Boyer-Moore算法、Rabin-Karp算法等等。

这些算法各自具有不同的特点和适用场景,可以根据实际需求选择合适的算法进行应用。

其中,暴力匹配算法是最简单直观的算法之一,它的思想是逐个比较目标字符串和待匹配字符串的每个字符,如果匹配失败则移动到下一个位置重新比较,直到找到匹配的位置或者遍历完整个字符串。

尽管该算法的时间复杂度较高(O(n*m),n和m分别为目标字符串和待匹配字符串的长度),但在一些规模较小或者匹配次数较少的场景中仍然具有一定的实用性。

而KMP算法则是一种高效的字符串匹配算法,它通过预处理目标字符串和待匹配字符串,构建部分匹配表来实现快速的匹配。

该算法的时间复杂度为O(n+m),其中n为目标字符串的长度,m为待匹配字符串的长度。

通过利用已匹配部分的信息,KMP算法能够跳过不必要的比较,从而极大地提高匹配效率。

类似地,Boyer-Moore算法和Rabin-Karp算法也是常用的多字符串匹配算法。

Boyer-Moore算法通过利用模式字符串最右端的字符进行比较,从而实现跳过多个字符的匹配。

而Rabin-Karp算法则通过哈希函数对目标字符串和待匹配字符串的子串进行哈希计算,从而高效地进行匹配。

通过对比不同的多字符串匹配算法,我们可以发现每种算法都有其优势和适用场景。

在实际应用中,我们可以根据字符串集合的规模、匹配次数的多少以及性能需求等因素来选择合适的算法。

kmp 字符串匹配算法

kmp 字符串匹配算法

kmp 字符串匹配算法KMP字符串匹配算法KMP算法,全称为Knuth-Morris-Pratt算法,是一种用于字符串匹配的高效算法。

它的核心思想是通过预处理模式串,根据模式串的前缀和后缀的特性来确定匹配失败时的下一步跳转位置,从而避免不必要的比较操作,提高匹配效率。

KMP算法的应用非常广泛,例如在文本编辑器中搜索关键字、DNA序列比对、音频和视频处理等领域都有广泛的应用。

1. KMP算法的基本原理KMP算法的基本原理是利用模式串的前缀和后缀的特性来确定匹配失败时的下一步跳转位置,从而避免不必要的比较操作,提高匹配效率。

具体来说,KMP算法通过预处理模式串,构建一个跳转表,用于确定匹配失败时的下一步跳转位置。

跳转表的构建过程是通过遍历模式串,计算每个位置的最长相同前缀后缀长度。

2. KMP算法的步骤KMP算法的步骤可以分为两个阶段:预处理和匹配。

2.1 预处理阶段在预处理阶段,首先需要计算模式串的最长相同前缀后缀长度。

具体步骤如下:- 定义两个指针i和j,分别指向模式串的第一个字符和第二个字符;- 如果i和j指向的字符相同,则将i和j都向后移动一位,并将j位置的最长相同前缀后缀长度记录在跳转表中;- 如果i和j指向的字符不同,则根据跳转表中记录的最长相同前缀后缀长度,更新j的位置。

2.2 匹配阶段在匹配阶段,根据跳转表进行匹配操作。

具体步骤如下:- 定义两个指针i和j,分别指向文本串和模式串的第一个字符;- 如果i和j指向的字符相同,则将i和j都向后移动一位;- 如果i和j指向的字符不同,则根据跳转表中记录的最长相同前缀后缀长度,更新j的位置。

3. KMP算法的优势相比于朴素的字符串匹配算法,KMP算法具有以下优势:- 避免了不必要的比较操作,减少了时间复杂度;- 预处理过程只需要对模式串进行一次,之后的匹配过程可以复用跳转表,减少了空间复杂度;- 适用于大规模的字符串匹配问题,可以高效地处理大文本串和大模式串。

字符串匹配研究改进

字符串匹配研究改进


假如,A="abababaababacb",B="ababacb",我们来看看 KMP是怎么工作的。我们用两个指针i和j分别表示,A[i-j+ 1..i]与B[1..j]完全相等。也就是说,i是不断增加的,随着i的 增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正 好匹配B串的前 j个字符(j当然越大越好),现在需要检验 A[i+1]和B[j+1]的关系。当A[i+1]=B[j+1]时,i和j各加一;什 么时候j=m了,我们就说B是A的子串(B串已经整完了),并 且可以根据这时的i值算出匹配的位置。当A[i+1]<>B[j+1], KMP的策略是调整j的位置(减小j值)使得A[i-j+1..i]与 B[1..j]保持匹配且新的B[j+1]恰好与A[i+1]匹配(从而使得i和 j能继续增加)。我们看一看当 i=j=5时的情况。 i = 1 2 3 4 5 6 7 8 9 …… A=abababaabab… B=ababacb j=1234567

从上面的这个例子,我们可以看到,新的j可以取多少与i无关,只 与B串有关。我们完全可以预处理出这样一个数组P[j],表示当匹配 到B数组的第j个字母而第j+1个字母不能匹配了时,新的j最大是多 少。P[j]应该是所有满足B[1..P[j]]=B[j-P[j]+1..j]的最大值。 再后来,A[7]=B[5],i和j又各增加1。这时,又出现了 A[i+1]<>B[j+1]的情况: i = 1 2 3 4 5 6 7 8 9 …… A=abababaabab… B= ababacb j= 1234567

研究出来的字符串匹配算法-k子串算法

研究出来的字符串匹配算法-k子串算法

研究出来的字符串匹配算法-k子串算法阿里巴巴首席工程师经验分享,物超所值前言最近工作中需要写一个算法,而写完这个算法我却发现了一个很有意思的事情。

需要的这个算法是这样的:对于A,B两个字符串,找出最多K个公共子串,使得这K个子串长度和最大。

百度之没有这样的算法,然后就开始想了一些乱七八糟的想法,一一被自己举反例推翻了,直到最后找到了正确算法,我觉得这个思考过程值得记录一下。

思考过程错误想法1:每次找最长公共子串,找到一个子串后,从A,B两个字符串中删除这个子串,之后在剩下的串中再找最长公共子串,像这样找K次。

举个反例:A=KABCDELMABCDEFGNFGHIJKB=KABCDEFGHIJKK=2按照这种方式选取结果为:ABCDEFG+HIJK,总长度为7+4=11,但是最优解为:KABCDE+FGHIJK总长度为6+6=12。

错误想法2:求A与B的最长公共子序列,之后从子序列中挑取最长的K段。

举个反例:A=EFGIJABCB=ABCEFHIJK=1按照这种方式选取,首先求出最长公共子序列EF-IJ,取出其中最长一段长度为2。

而最优解为:ABC,长度为3。

正确解法:动态规划上面两个看似取巧但是不对的想法被推翻后,也能让我静下心来进行系统性的思考了,正确解法为动态规划。

动态规划最重要的事情有三件:找问题的状态,找转移方程,边界初始化。

找对状态就相当于成功了一半,找到转移方程基本问题就算解了,边界初始化可以忽略不计。

找状态除了靠灵感之外,我最喜欢的方法是分解问题,找到问题的最原子的状态,之后搭积木般的组合拼装就OK了。

设dp[i][j][k]表示为以A[i],B[j]为第K个公共子串结尾时,所能得到的最大值。

其中A[i]为字符串A第i个字符,B[j]为字符串B的第j个字符。

在考虑A[i]和B[j]时,如果A[i] = B[j],那么A[i],B[j]可以单独组成第K个串,也可以和A[i-1],B[j-1]组合在一起作为第K个串,则转移方程如下:dp[i][j][k] = dp[i-1][j-1][k] + 1 (与A[i-1],B[j-1]连在一起)dp[i][j][k] = max(dp[i'][j'][k-1] + 1) (A[i],B[j]单独成为第K个串)当单独成串时,需要遍历所有i',j',如果我们能在计算dp[i][j][k]的时候顺便记录截止到当前选取k个串时的最大值的话,就可以避免遍历,所以最后的状态以及转移方程如下:dp[i][j][k] = max(dp[i-1][j-1][k] + 1, maxscore[i-1][j-1][k-1] + 1)maxscore[i][j][k] = max(maxscore[i-1][j][k],maxscore[i][j-1][k], dp[i][j][k])现在回头看一下这个算法,当K=1的时候就是最长公共子串问题,当K=min(length(A), length(B))的时候就是最长公共子序列问题,想想还是挺有意思是的。

字符串匹配算法

字符串匹配算法

字符串匹配算法字符串匹配算法是一种计算机科学领域中重要的基础算法。

它在广泛的应用领域中都有重大作用,比如文本处理、文本搜索、生物信息学、语音识别等。

字符串匹配算法可以在给定的文本或字符串中快速查找所需的子串。

这类算法的定义是通过模式和文本的对比来查找子串,如果模式在文本中发现,就代表算法成功匹配了字符串。

字符串匹配算法分为基于内容的和基于文本的,而且其中还有很多不同的算法技术,如暴力搜索法、KMP算法、BoyerMoore算法,这些算法有各自的优点和特点。

暴力搜索法是最基础的字符串匹配算法,它的基本思想是从文本的第一个字符开始,将模式中的每一个字符逐一与文本中的字符相比较,每比较完一个字符,文本指针就向后移动一位,直到模式中的每一个字符都被比较完,如果文本中的所有字符都与模式中的字符相同,则模式匹配成功,否则匹配失败,在失败后文本指针会重新指向文本的第二个字符重新进行模式匹配。

KMP算法是一种效率较高的字符串匹配算法,它的思路是先在模式字符串中构造一个部分匹配表,然后根据模式串和文本串的匹配情况,如果不匹配,就会根据部分匹配表往回退,寻找新的匹配位置。

KMP算法的运行效率比暴力搜索法要高,它涉及到字符串的预处理,在多次匹配的应用中,KMP算法的运行效率更高。

BoyerMoore算法是一种更为复杂的字符串匹配算法,它同样是基于文本搜索,它是暴力搜索与KMP算法的有机结合。

BoyerMoore算法在比较和移动模式字符串上比KMP算法效率更高,它充分利用字符串中坏字符的特性,在比较和移动模式字符串时做出了非常明智的选择,这就使得BoyerMoore算法的效率比KMP算法更高。

字符串匹配算法是计算机科学领域中重要的基础算法,其在文本处理、文本搜索、生物信息学、语音识别等方面都发挥了重要作用。

字符串匹配算法分为基于内容的和基于文本的,而且其中还有暴力搜索法、KMP算法、BoyerMoore算法等许多不同的算法技术,每一种算法都有其特殊的优点。

字符串匹配问题的算法步骤

字符串匹配问题的算法步骤

字符串匹配问题的算法步骤字符串匹配是计算机科学中常见的问题,主要用于确定一个字符串是否包含另一个字符串。

解决这个问题的算法可以分为暴力匹配算法、Knuth-Morris-Pratt(KMP)算法和Boyer-Moore(BM)算法等。

暴力匹配算法是最简单的一种方法。

它的基本思想是从主串的第一个字符开始,依次和模式串的每个字符进行比较,直到找到一个字符不匹配为止。

如果找到了不匹配的字符,则将主串的指针后移一位,重新开始匹配。

如果匹配成功,模式串的指针向后移一位,主串的指针也向后移一位,继续匹配。

这个过程一直进行下去,直到模式串的指针到达模式串的末尾,或者找到了一个匹配的子串。

尽管暴力匹配算法很简单,但是它的时间复杂度较高,为O(m*n),其中m是主串的长度,n是模式串的长度。

当主串和模式串很长时,暴力匹配算法的效率就会很低。

为了提高字符串匹配的效率,有很多其他的算法被提出。

其中比较著名的是KMP算法和BM算法。

KMP算法的核心思想是,当发生不匹配的情况时,不需要回溯主串的指针,而是通过已经匹配的部分字符的信息,将模式串的指针移动到一个新的位置,从而避免了不必要的比较。

具体来说,KMP算法在匹配的过程中,通过建立一个部分匹配表(Partial Match Table),来记录模式串中每个位置的最长前缀后缀的长度。

当发生不匹配的情况时,根据部分匹配表的信息,可以将模式串的指针直接移动到下一个可能匹配的位置。

BM算法是一种基于启发式的匹配算法,它的核心思想是从模式串的尾部开始匹配,并根据已经匹配的部分字符的信息,跳跃式地移动模式串的指针。

具体来说,BM算法分别构建了坏字符规则和好后缀规则。

坏字符规则用于处理主串中与模式串不匹配的字符,找到最右边的该字符在模式串中的位置,并移动模式串的指针到对齐该字符。

好后缀规则用于处理主串中与模式串匹配的部分,找到最右边的该部分在模式串中的位置,并移动模式串的指针到对齐该部分。

字符串匹配算法

字符串匹配算法

字符串匹配算法公告:CSDN新版博客排名规则公示,请各位用户周知字符串匹配算法(一)简介分类:算法2008-10-29 15:223587人阅读评论(8)收藏举报注:本文大致翻译自EXACT STRING MATCHING ALGORITHMS,去掉一些废话,增加一些解释。

文本信息可以说是迄今为止最主要的一种信息交换手段,而作为文本处理中的一个重要领域——字符串匹配,就是我们今天要说的话题。

(原文还特意提及文本数据数量每18个月翻一番,以此论证算法必须要是高效的。

不过我注意到摩尔定律也是18个月翻番,这正说明数据的增长是紧紧跟随处理速度的,因此越是使用高效的算法,将来待处理的数据就会越多。

这也提示屏幕前的各位,代码不要写得太快了……)字符串匹配指的是从文本中找出给定字符串(称为模式)的一个或所有出现的位置。

本文的算法一律输出全部的匹配位置。

模式串在代码中用x[m]来表示,文本用y[n]来,而所有字符串都构造自一个有限集的字母表Σ,其大小为σ。

根据先给出模式还是先给出文本,字符串匹配分为两类方法:第一类方法基于自动机或者字符串的组合特点,其实现上,通常是对模式进行预处理;第二类方法对文本建立索引,这也是现在搜索引擎采用的方法。

本文仅讨论第一类方法。

文中的匹配算法都是基于这样一种方式来进行的:设想一个长度为m的窗口,首先窗口的左端和文本的左端对齐,把窗口中的字符与模式字符进行比较,这称为一趟比较,当这一趟比较完全匹配或者出现失配时,将窗口向右移动。

重复这个过程,直到窗口的右端到达了文本的右端。

这种方法我们通常叫sliding window。

对于穷举法来说,找到所有匹配位置需要的时间为O(mn),基于对穷举法改进的结果,我们按照每一趟比较时的比较顺序,把这些算法分为以下四种:1从左到右:最自然的方式,也是我们的阅读顺序2从右到左:通常在实践中能产生最好的算法3特殊顺序:可以达到理论上的极限4任意顺序:这些算法跟比较顺序没关系(例如:穷举法)一些主要算法的简单介绍如下:从左到右采用哈希,可以很容易在大部分情况下避免二次比较,通过合理的假设,这种算法是线性时间复杂度的。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

字符串匹配算法的研究及其程序实现计算机学院计算机科学与技术专业2007级指导教师:滕云摘要:在字符串匹配算法之中,最古老和最著名的是由D. E. Knuth, J. h. Morris, V. R. Pratt 在1997年共同提出的KMP算法。

直至今日,人们对字符串匹配问题还在进行着大量的研究,以寻求更简单,或者平均时间复杂度更优的算法;学者们在不同的研究方向上,设计出了很多有效的匹配算法。

在现实生活中,串匹配技术的应用十分广泛,其主要领域包括:入侵检测,病毒检测,信息检索,信息过滤,计算生物学,金融检测等等。

在许多应用系统中,串匹配所占的时间比重相当大,因此,串匹配算法的速度很大程度上影响着整个系统的性能。

该论文重点分析了KMP算法的实现原理和C语言实现,并在此基础上提出了改进的KMP算法,使得该算法更方便实用。

关键词:KMP算法;时间复杂度;串匹配;改进;方便使用;String matching algorithm and Implementation of the Program College of Computer Sciences, Computer Science and Technology Professionalgrade 2007, Instructor YunTengAbstractor:Among the string matching algorithm,the oldest and most famous is KMP algorithm co-sponsored by D.E Knuth, J. h. Morris, VR Pratt in 1997. As of today, a lot of research to String matching are still in progress, to seek a more simply or better average time complexity of the algorithm. In different research direction, scholars have designed a lot of valid matching.In real life, the string matching technique is widely used,The main areas include: intrusion detection, virus detection, information retrieval, information filtering, computational biology, financial inspection and so on.In many applications,a large percentage of the time was placed by the string matching, so the string matching algorithms significantly affect the speed performance of the whole system.The paper analyzes the implementation of the KMP algorithm theory and through the C language to achieve it.And we puts forward a modified KMP algorithm in order to makes the algorithm more convenient and practical.Key words:KMP algorithm; Time complexity; String matching; Improved; Easy to use;目录摘要﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 1 ABSTRACT﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 1第一章引言﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 3第一节:字符串匹配研究的目的和意义﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒3第二节:本文的内容和安排﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 3第二章串匹配算法的概念与研究现状﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒ 4第一节:字符串匹配的有关概念﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒4第二节:字符串匹配算法的研究现状﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒4第三章KMP算法和BM算法及其改进算法的研究及实现﹒﹒﹒﹒﹒﹒5 第一节:KMP算法的研究及实现﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒5第二节:KMP算法改进及其程序实现﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒8第四章总结和展望﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒12 第一节:总结﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒13第二节:展望﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒13参考文献﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒14致谢﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒﹒14第一章:引言第一节:字符串匹配研究的目的和意义字符串是计算机科学中常见的基本概念,搜索问题也是计算机科学中的基本问题。

而且迄今为止文本信息仍然还是最主要的信息交换手段之一,因此作为文本处理中的一个重要领域——字符串匹配,就显得尤其的重要,随着互联网的日渐庞大,信息也是越来越多,如何在海量的信息中快速查找自己所要的信息是网络搜索研究的热点所在;在这其中,字符串匹配算法起着非常重要的作用,一个高效的字符串匹配算法,可以极大的提高搜索的效率和质量。

本文力图阐明字符串匹配算法的发展过程中的两个重要的算法KMP算法和BM算法,并且并介绍了各个算法的特点,并给予了适当的比较和分析,进而提出了新的字符串匹配算法希望能够在各方面有所改进。

字符串匹配技术有着十分广泛的应用领域,它的最直接的应用领域是构建数据的全文检索系统和图书文献目录摘要的查询系统。

尤其在近年来,网络技术马不停蹄的快速发展,网络带宽不断增加,随之出现的问题也越来越多,加之随着网络技术和生物技术的不断发展,串模式匹配技术又在网络安全,网络信息检索和生物计算等领域中发挥着重要作用,并不断发展。

而且在对大量黄色信息,反动言论和国家机密的过滤方面以及入侵检测技术和内容过滤技术方面字符串匹配算法也扮演者一个不可或缺的角色。

随着生命科学技术的发展,人们对生命物质的微观结构的认识越来越清晰。

而且人类基因组序列的绘制工作目前己经完成。

计算生物学中的一个最基本问题是,寻找一个或一组基因片断在一个基因序列中的出现位置,以比较基因的相似性和遗传关系;或者根据己知的蛋白质样本去匹配未知的蛋白质序列,来确定这种未知的蛋白质序列所属蛋白质的种类和功能。

由于蛋白质和基因都可以使用建立在一定字符集上的符号序列来表示,因而传统的字符串匹配技术又有了新的发挥之地。

尤其是近些年来的发展,科学家们对基因发生的突变和进化等变化进行研究,来描述同一物种的基因序列可能存在一定的差别,所以这就促进了“近似匹配”技术的又一提高和发展。

综上所述,字符串匹配技术在众多的领域中发挥着基础的核心作用,对字符串匹配算法作进一步的研究和改进,对于提高执行的效率、增加应用系统的性能、节约硬件成本等有着重要的现实意义。

第二节:本文的内容和安排本文通过对经典字符串匹配算法的深入理解和分析,在KMP算法的基础上提出了两种改进算法,并且给出了程序实现代码,经过分析和测试确定其性能得到提高,在某些方面都达到了较高的水平。

本文的后续的章节安排为:第二章将对字符串匹配算法的概念进行归纳并总结其研究现状;第三章详细分析字符串匹配算法:KMP算法,并提出相应的新的改进算法,而且深入分析所涉及到的经典算法的思想以及程序的实现方法,并且将改进后的算法与之比较,得出改进后算法的优点。

最后第四章进行总结和展望。

第二章串匹配算法的概念与研究现状第一节:字符串匹配的有关概念字符串是n ( 0 ) 个字符的有限序列,记作 S : “c0c1c2…cn-1”。

其中,S是串名字;“c0c1c2…cn-1”是串值;ci是串中字符;n是串的长度。

如:“Welcome to Linux world ”模式匹配是串的基本运算之一。

它是指在串中寻找子串(第一个字符)在串中的位置。

有两个字符串T和S,字符串T称为正文,字符串S称为模式,要求找出模式S在正文T中的首次出现的位置。

一旦模式S在正文T中找到,就说发生一次匹配。

有些应用可能会要求找出所有的匹配位置。

算法复杂度分为时间复杂度和空间复杂度。

其作用:时间复杂度是度量算法执行的时间长短;而空间复杂度是度量算法所需存储空间的大小。

KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。

简单匹配算法的时间复杂度为O(m*n);KMP匹配算法的时间复杂度为O(m+n).第二节:字符串匹配算法的研究现状近年来,学术界的兴趣与日俱增,特别在生物信息学和信息检索两个领域中,需要处理的文本规模越来越大,而且需要在文本中进行越来越复杂的搜索。

因此,出现了一种非标准的模式匹配问题,该问题涵盖的内容包括通配符、近似匹配等等。

近期,学术界最活跃的问题之一就是研究带有通配符的串匹配问题。

即带有don't care或wildcard字符。

然而,通配符的引入会让问题定义更加灵活,却也带来了复杂性。

算法的设计有时不仅仅考虑时空效率,保证匹配结果的完备性很可能成为算法设计更重要的问题。

在串匹配研究领域中,一个人所共知的事实是“算法的思想越简单,实际应用的效果越好”。

另外,随着新一代计算机的产生,会出现一些新技术,例如位并行等。

然而KMP算法依然占据着不可替代的作用,尤其是他们的优化版更是应用广泛。

第三章:KMP算法和BM算法及其改进算法的研究及实现第一节:KMP算法的研究及实现KMP算法是一种线性时间复杂的字符串匹配算法,它是对BF算法(Brute-Force,最基本的字符串匹配算法的)改进。

由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。

KMP算法的关键是根据给定的模式串W1,m,定义一个next函数。

next 函数包含了模式串本身局部匹配的信息。

首先,我们引入一个叫失败链接值(faillink)的概念,就是说“每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的‘部分匹配’结果(匹配串的每个字符的失败链接值)将模式(匹配子串)向右‘滑动’尽可能远的一段距离,继续进行比较。

”其实质失败链接值就是一个和主串完全无关只和子串相关的值。

相关文档
最新文档