zoukankan      html  css  js  c++  java
  • 《大话数据结构》读书笔记(2)

      这一篇再来说说我对于串的理解。

      字符串是我们经常会用到的一种数据类型,它可以表示为一个字符数组。

      1、数据类型

        对于字符串的操作会有很多,但其中非常核心则是比较、拼接、截取、索引和替换,都是围绕子串一些操作。

      2、存储结构

        因为字符串实质上是一个字符数组,所以是以数组的方式存储,但会有一个“”作为结束标记。

      3、模式匹配算法

        所谓模式匹配就是子串的定位操作,即判断字符串中是否包含子串,在什么位置。比如,“goodgoogle”是否包含“google”,在什么位置。通常,我们会设置两个参数i,j,在循环内依次递增。从第一个字符开始,如果相等,则参数+1,比较下一个字符。如果不等,则i退回到第二个字符,j退回到第一个字符,这样不断下去。然而,这种方式在处理由很多0和1组成的串时,效率非常的低下。

      4、KMP模式匹配算法

        原理:

          如果我们知道子串中的首字符与后面的字符均不相等,而子串的第二位与主串的第二位相等,那么,主串的第二位必定与子串的首字符不相等。

        next[]:

          0(j=1);

          max{k|1<k<j,且“p1..pk-1".="pj-k+1...pj-1"};

          1;

         推导:

          比如“abcdex”,我们来推导其next[];

          1)j=1,next[1]=0;

          2) j=2,前面只有"a",next[2]=1;

          3) k=3,前面是“ab”,a,b不相等,next[3]=1;

          4) 同理,next[]=011111;

          再比如“abcabx”,

          1)j=1,next[1]=0;

          2) j=2,3,4,next[2]=next[3]=next[4]=1;

           3)  j=5,前面是“abca”,由p1=p4,得k=2,即next[5]=2;

          4) j=6,前面是”abcab“,由p1p2=p4p5,得k=3,即next[6]=3;

          5) 所以,next[]=011123;

          有了next[],子串就不用每次都退回第一个字符,而只需要退回next[]所指示的字符开始,比如next[5]=2,那么子串匹配只需要从第二个字符开始就可以了,这样可以极大的提升计算的效率。

  • 相关阅读:
    govendor用法
    java.util.DualPivotQuickSort的实现
    windows注册表
    一道正则表达式题目
    JDK10、JDK11、JDK12新特性
    初夏清晨有所思
    Java 9新特性
    sklearn聚类评价指标
    沉浸式和全局式
    [抄]外部奖励对内在动机的侵蚀
  • 原文地址:https://www.cnblogs.com/xsddxz/p/10134133.html
Copyright © 2011-2022 走看看