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,那么子串匹配只需要从第二个字符开始就可以了,这样可以极大的提升计算的效率。

  • 相关阅读:
    Delphi XE4 FireMonkey 开发 IOS APP 发布到 AppStore 最后一步.
    Native iOS Control Delphi XE4
    Delphi XE4 iAD Framework 支持.
    using IOS API with Delphi XE4
    GoF23种设计模式之行为型模式之命令模式
    Android青翼蝠王之ContentProvider
    Android白眉鹰王之BroadcastReceiver
    Android倚天剑之Notification之亮剑IOS
    Android紫衫龙王之Activity
    GoF23种设计模式之行为型模式之访问者模式
  • 原文地址:https://www.cnblogs.com/xsddxz/p/10134133.html
Copyright © 2011-2022 走看看