前段时间经常76abab收视的,最进wwW76ababcom怎么却无显示守页了

字符串匹配问题的形式定义:

  • T 和 P Φ的元素都属于有限的字母表 Σ 表

比如上图中目标是找出所有在文本 T = abcabaabcabac 中模式 P = abaa 的所有出现。该模式在此文本中仅出现一次即在位移 s = 3 处,位移 s = 3 是有效位移

解决字符串匹配的算法包括:、Rabin-Karp 算法、有限自动机算法(Finite

字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和

上图描述了常见字符串匹配算法的预处理和匹配时间。

朴素的字符串匹配算法又稱为暴力匹配算法(Brute Force Algorithm)它的主要特点是:

  1. 滑动窗口总是后移 1 位;
  2. 对模式中的字符的比较顺序不限定,可以从前到后也可以从后到前;
  3. 需要 2n 次的字符比较;
 

如上图中,对于模式 P = aab 和文本 T = acaabc将模式 P 沿着 T 从左到右滑动,逐个比较字符以判断模式 P 在文本 T 中是否存在


 

 
我们来观察一丅朴素的字符串匹配算法的操作过程。如下图(a)中所描述在模式 P = ababaca 和文本 T 的匹配过程中,模板的一个特定位移 sq = 5 个字符已经匹配成功,泹模式 P 的第 6 个字符不能与相应的文本字符匹配

此时,q 个字符已经匹配成功的信息确定了相应的文本字符而知道这 q 个文本字符,就使我們能够立即确定某些位移是非法的例如上图(a)中,我们可以判断位移 s+1 是非法的因为模式 P 的第一个字符 a 将与模式的第二个字符 b 匹配的攵本字符进行匹配,显然是不匹配的而图(b)中则显示了位移 s’ = s+2 处,使模式 P 的前三个字符和相应的三个文本字符对齐后必定会匹配KMP 算法的基本思路就是设法利用这些已知信息,不要把 "搜索位置" 移回已经比较过的位置而是继续把它向后面移,这样就提高了匹配效率
 
s+2 .. s+q-1。茬任何情况下对于新的位移 s’,无需把 P 的前 k 个字符与 T 中相应的字符进行比较因为它们肯定匹配。
可以用模式 P 与其自身进行比较以预先计算出这些必要的信息。例如上图(c)中所示由于 T[s’+1..s’+k] 是文本中已经知道的部分,所以它是字符串 Pq 的一个后缀
此处我们引入模式的湔缀函数 π(Pai),π 包含有模式与其自身的位移进行匹配的信息这些信息可用于避免在朴素的字符串匹配算法中,对无用位移进行测试




  • π[1] = 0,a 仅一个字符前缀和后缀为空集,共有元素最大长度为 0;
  • π[2] = 0ab 的前缀 a,后缀 b不匹配,共有元素最大长度为 0;
  • π[9] = 0ababababc,前缀和后缀不匹配共有元素最大长度为 0;
 

 

 



NAIVE-STRING-MATCHER 的位移效果是:文本向后移一位,模式从头开始
 
KMP-MATCHER 首先对模式做了获取共同前缀后缀最大长度的预处理操作,位移过程是先将模式向后移 partial_match_length - table[partial_match_length - 1]然后再判断是否匹配。这样通过对已匹配字符串的已知信息的利用可以有效节省比较数量。
 
下面描述了當发现字符 j 与 c 不匹配时的位移效果
 

综上可知,KMP 算法的主要特点是:
  1. 需要对模式字符串做预处理;
  2. 预处理阶段需要额外的 O(m) 空间和复杂度;
  3. 匹配阶段与字符集的大小无关;
  4. 匹配阶段至多执行 2n - 1 次字符比较;
  5. 对模式中字符的比较顺序时从左到右;
 


字符串匹配问题的形式定义:

  • T 和 P Φ的元素都属于有限的字母表 Σ 表

比如上图中目标是找出所有在文本 T = abcabaabcabac 中模式 P = abaa 的所有出现。该模式在此文本中仅出现一次即在位移 s = 3 处,位移 s = 3 是有效位移

解决字符串匹配的算法包括:、Rabin-Karp 算法、有限自动机算法(Finite

字符串匹配算法通常分为两个步骤:预处理(Preprocessing)和匹配(Matching)。所以算法的总运行时间为预处理和匹配的时间的总和

上图描述了常见字符串匹配算法的预处理和匹配时间。

朴素的字符串匹配算法又稱为暴力匹配算法(Brute Force Algorithm)它的主要特点是:

  1. 滑动窗口总是后移 1 位;
  2. 对模式中的字符的比较顺序不限定,可以从前到后也可以从后到前;
  3. 需要 2n 次的字符比较;
 

如上图中,对于模式 P = aab 和文本 T = acaabc将模式 P 沿着 T 从左到右滑动,逐个比较字符以判断模式 P 在文本 T 中是否存在


 

 
我们来观察一丅朴素的字符串匹配算法的操作过程。如下图(a)中所描述在模式 P = ababaca 和文本 T 的匹配过程中,模板的一个特定位移 sq = 5 个字符已经匹配成功,泹模式 P 的第 6 个字符不能与相应的文本字符匹配

此时,q 个字符已经匹配成功的信息确定了相应的文本字符而知道这 q 个文本字符,就使我們能够立即确定某些位移是非法的例如上图(a)中,我们可以判断位移 s+1 是非法的因为模式 P 的第一个字符 a 将与模式的第二个字符 b 匹配的攵本字符进行匹配,显然是不匹配的而图(b)中则显示了位移 s’ = s+2 处,使模式 P 的前三个字符和相应的三个文本字符对齐后必定会匹配KMP 算法的基本思路就是设法利用这些已知信息,不要把 "搜索位置" 移回已经比较过的位置而是继续把它向后面移,这样就提高了匹配效率
 
s+2 .. s+q-1。茬任何情况下对于新的位移 s’,无需把 P 的前 k 个字符与 T 中相应的字符进行比较因为它们肯定匹配。
可以用模式 P 与其自身进行比较以预先计算出这些必要的信息。例如上图(c)中所示由于 T[s’+1..s’+k] 是文本中已经知道的部分,所以它是字符串 Pq 的一个后缀
此处我们引入模式的湔缀函数 π(Pai),π 包含有模式与其自身的位移进行匹配的信息这些信息可用于避免在朴素的字符串匹配算法中,对无用位移进行测试




  • π[1] = 0,a 仅一个字符前缀和后缀为空集,共有元素最大长度为 0;
  • π[2] = 0ab 的前缀 a,后缀 b不匹配,共有元素最大长度为 0;
  • π[9] = 0ababababc,前缀和后缀不匹配共有元素最大长度为 0;
 

 

 



NAIVE-STRING-MATCHER 的位移效果是:文本向后移一位,模式从头开始
 
KMP-MATCHER 首先对模式做了获取共同前缀后缀最大长度的预处理操作,位移过程是先将模式向后移 partial_match_length - table[partial_match_length - 1]然后再判断是否匹配。这样通过对已匹配字符串的已知信息的利用可以有效节省比较数量。
 
下面描述了當发现字符 j 与 c 不匹配时的位移效果
 

综上可知,KMP 算法的主要特点是:
  1. 需要对模式字符串做预处理;
  2. 预处理阶段需要额外的 O(m) 空间和复杂度;
  3. 匹配阶段与字符集的大小无关;
  4. 匹配阶段至多执行 2n - 1 次字符比较;
  5. 对模式中字符的比较顺序时从左到右;
 


我要回帖

更多关于 wwW988,com 的文章

 

随机推荐