1. 程式人生 > >《大話資料結構》讀書筆記(2)

《大話資料結構》讀書筆記(2)

  這一篇再來說說我對於串的理解。

  字串是我們經常會用到的一種資料型別,它可以表示為一個字元陣列。

  1、資料型別

    對於字串的操作會有很多,但其中非常核心則是比較、拼接、擷取、索引和替換,都是圍繞子串一些操作。

  2、儲存結構

    因為字串實質上是一個字元陣列,所以是以陣列的方式儲存,但會有一個“\0”作為結束標記。

  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,那麼子串匹配只需要從第二個字元開始就可以了,這樣可以極大的提升計算的效率。