数据结构-4.3串、数组和广义表

前言-数据结构

数据结构是需要反复咀嚼,不管什么时候都可以重中获取现在在开发中的遇到的问题答案。

串的模式匹配

KMP模式

  • 说明

  • 因p1≠p2,S2=P2;必有s2≠p1,又因p1=p3,s3=p3;所以必有s3=p1。因此,第二次匹配可直接从i=4,j=2开始。
    在这里插入图片描述

  • 改进:每趟匹配过程中出现字符比较不等时,不回溯主指针i ,利用已得到的“部分匹配”结果将模式向右滑动尽可能远的一段距离,继续进行比较。

KMP算法

  • 说明
  • 为此,定义next[j]函数,表明当模式中第j个字符与主串中相应字符“失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。在这里插入图片描述
  • next[j]函数表征着模式P中最大相同首子串和尾子串(真子串)的长度。可见,模式中相似部分越多,则next[j]函数越大,它既表示模式串中的字符之间的相关度越高,模式串向右滑动得越远,与主串进行比较的次数越少,时间复杂度就越低。
  • 关于 k = next[j] 的计算公式
  • 情形1:当j=1时,next[j]=0:next[j]=0表示根本不进行字符比较.
  • 情形2:当j>1时,nexti]的值为:模式串的位置 从1到-1构成的串中所出现的首尾相同的子串的最大长度加1
  • 情形3:当无首尼相同的子串时nextij的值为1。next[j]=1表示从模式串头部开始进行字符比较.

例子

  • 例子1
    在这里插入图片描述

  • 当 j = 1时,k = next[j] = 0;公式规定

  • 当 j = 2时,k = next[j] = 1; 因为前面就只有一个 a 子串,所以其实算无首尾相应 k = 1;

  • 当 j = 3时,k = next[j] = 1;因为在 模式串的子串 p1 - pj-1 中(a b),a != b,所以k = 1;

  • 当 j = 4时,k = next[j] = 2;因为在 模式串的子串 p1 - pj-1 中(a b a),a = b,此时 相等的子串的长度为1 ,所以k = 1 + 1;

  • 当 j = 6时,k = next[j] = 3;因为在 模式串的子串 p1 - pj-1 中(a b a a b),(a b) = (a b),此时 相等的子串的长度为2 ,所以k = 2 + 1;

  • 例子2

  • 上个例子的 next[2] = 1,I= 2,j = 2在这里插入图片描述

  • next[1] = 0, i = i + 1
    在这里插入图片描述

  • next[6] = 3 i = 3 j = 8 不相等,所以 S的i不变, j = 3
    在这里插入图片描述

  • 第四趟
    在这里插入图片描述

总结 KMP算法

  • 在串S和串T中分别设比较的起始下标i和j
  • 循环直到S中所剩字符长度小于T的长度或T中所有字符均比较完毕。
    • 如果S[i] = T[j],继续比较S和T的下一个字符,否则将j向右滑动到next[j]位置,即 j = next[j];
    • 如果j = 0,则将i和j分别加1,准备下一趟比较
  • 如果T中所有字符均比较完毕,则返回匹配的那个i和j 下标,否则返回0

猜你喜欢

转载自blog.csdn.net/weixin_41732253/article/details/109540615