数据结构第四章-串

数据结构第四章-串

计算机学科基础:数据结构第四章串的学习笔记

1.串的定义(特殊的线性表,了解)

  • 定义:串是由零个或多个字符组成的有限序列(串的数据对象限定为字符集)
  • 串中字符的个数n称为串的长度。n=0时的串称为空串
  • 串中任意多个连续的字符组成的子序列称为该串的子串,包含子串的串称为主串。(以子串作为操作对象)
  • 某个字符在串中的序号称为该字符在串中的位置。子串在主串中的位置以子串的第一个字符在主串中的位置来表示。
  • 两个串的长度相等且每个对应位置的字符都相等时,称这两个串是相等的。

2.串的模式匹配(串的定位操作✪)

  • 子串的定位操作通常称为串的模式匹配,它求的是子串(常称模式串)在主串中的位置。

  • KMP算法(选择题考点✪)

    • 每次匹配失败之后,无需回溯主串指针,根据next数组的对应关系来决定当前的模式串的指针设置
      next数组只与模式串有关,与主串无关

    • 利用next数组控制指针回溯的举例

      • 此时在第五个元素匹配失败之后,只需要将模式串指针移动到2位置继续与主串的5位置比较
        • pCW1ak9.png
      • 移动之后的情况如下
        • pPFsrZR.png
    • 代码实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      int Index_KMP(SString S,SString T,int next[]){
      int i=1,j=1;
      while(i<=S.length&&j<=T.length){
      if(j==0||S.ch[i]==T.ch[j]){
      ++i;
      ++j; //继续比较后继字符
      }
      else
      j=next[j]; //模式串向右移动
      }
      if(j>T.length)
      return i-T.length; //匹配成功
      else
      return 0;
      }
    • 时间复杂度:O(m+n)

  • 求next数组(选择题考点,手算方法♚)

    • next[j]的含义是在子串的第j个字符与主串发生失配时,则跳到子串的next[j]位置重新与主串当前位置进行比较
    • 求解方法:
      • 首先1号2号位分别固定是0和1
      • 若要比较第n位,在上方写出比较字符,只写出其中n-1位前的值(如比较第3位则只需要写出前2位)
        下方平行地写出模式串完整字符
      • 此时在比较字符的第n位之前画一个竖线,开始进行比较,在下方的模式串进行后移
      • 当后移到某一位时,模式串能与上方的比较字符完全匹配时,此时记录当前的模式串位数为next数组中对应位的值
        如果模式串已经全部后移出竖线右侧,说明此时next数组的值为1
    • 完全匹配的展示
      • pPFcaz8.png
    • 例:比较第4位的情况
      • 此时画到第四位之前,将模式串逐步后移检查,此时会后移两位才能完全匹配
        • pPFcmPx.png
      • 后移到模式串的第一位a时,此时与上方的比较字符的a匹配,此时为第2位,记录在next数组中的序号4位置
        • pPFctit.png
  • 对KMP算法的进一步优化(将next数组转变成nextval数组)

    • nextval数组概述

      • 首先需要先把模式串的next数组算出来,初始的nextval数组可以确定第一个序号的值为0
      • 此时从前往后(序号2开始)依次观察每个序号对应的next的值所对应的序号的模式串
        如下方的序号2的next数组的值为1,1的序号下的模式串为a
      • 若其next数组所对应的序号的模式串的与当前序号的模式串相同,
        此时新建立的nextval的值改为其next数组所对应序号的nextval数组的值(2的nextval改为0)
        否则与原来的next数组的值一致

      • 转换流程(依次转换)

        • pCWaD1J.png
    • 注意:比较字符相同后,赋值是赋予nextval数组的值,而非原数组的值,如下题选C

      • pCWBegg.png
    • 如果next数组最初的指针是从-1开始,则第一第二序号赋值为-1,0,之后的序号的指针起始位是0,如下题选C;

      • pCWBkUP.png
-------------本文结束-------------