<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 251  文章 - 504  trackbacks - 0
    <2006年10月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    本博客系個人收集材料及學習記錄之用,各類“大俠”勿擾!

    留言簿(14)

    隨筆分類

    收藏夾

    My Favorite Web Sites

    名Bloger

    非著名Bloger

    搜索

    •  

    積分與排名

    • 積分 - 202423
    • 排名 - 285

    最新評論

    1、建立目標串s和模式串t
    2、采用簡單算法求t在s中的位置
    3、由模式串t求出next值和nextval值
    4、采用KMP算法和KMP改進算法求t在s中的位置

    代碼如下:
    #include<stdio.h>
    #include<string.h>
    #define MaxSize 100

    typedef struct
    {
    ?char ch[MaxSize];
    ?int len;
    }SqString;

    int Index(SqString s,SqString t)/* 簡單匹配方法*/
    {
    ? int i=0,j=0,k;
    ? while(i<s.len&&j<t.len)
    ? {
    ??? if(s.ch[i]==t.ch[j])/*繼續匹配下一個字符*/
    ?{
    ?? i++;
    ?? j++;
    ?}
    ?else/*子串、主串的指針回溯重新開始下一次匹配*/
    ?{
    ? i=i-j+1;
    ? j=0;
    ?}
    ? }
    ? if(j>=t.len)/*匹配成功,返回匹配的第一個字符下標*/
    ?? k=i-t.len;
    ? else/*匹配不成功*/
    ?? k=-1;
    ? return k;
    }

    void GetNext(SqString t,int next[])/*由模式串t求出next值*/
    {
    ?int j,k;
    ?j=0;k=-1;next[0]=-1;
    ?while(j<t.len-1)
    ?{
    ?? if(k==-1||t.ch[j]==t.ch[k])
    ?? {
    ???? j++;k++;
    ???? next[j]=k;
    ?? }
    ?? else k=next[k];
    ?}
    }

    void GetNextval(SqString t,int nextval[])/*由模式串t求出nextval值*/
    {
    ?? int j=0,k=-1;
    ?? nextval[0]=-1;
    ?? while(j<t.len)
    ?? {
    ??? if(k==-1||t.ch[j]==t.ch[k])
    ??? {
    ????? j++;k++;
    ?? if(t.ch[j]!=t.ch[k])
    ??
    ??? nextval[j]=k;
    ?? else
    ?????? nextval[j]=nextval[k];

    ?? }
    ?? else k=nextval[k];
    ???
    ?? }
    }
    int KMPIndex(SqString s,SqString t)/*KMP算法*/
    {
    ?? int next[MaxSize];
    ?? int i=0,j=0;
    ?? int v;
    ?? GetNext(t,next);
    ?? while(i<s.len && j<t.len)
    ?? {
    ???? if(j==-1||s.ch[i]==t.ch[j])
    ???? {
    ???? ?i++;
    ???? ?j++;
    ?? }
    ?? else j=next[j];
    ?? }
    ?? if(j>=t.len)
    ?? v=i-t.len;
    ?? else
    ?? v=-1;
    ?? return v;
    }

    int KMPIndex1(SqString s,SqString t)/*改進的KMP算法*/
    {
    ?int nextval[MaxSize],next[MaxSize],i=0,j=0,v;
    ?GetNextval(t,next);
    ?GetNextval(t,nextval);
    ?while(i<s.len&&j<t.len)
    ?{
    ? if(i==-1||s.ch[i]==t.ch[j])
    ? {
    ??? i++;
    ?j++;
    ? }
    ? else j=nextval[j];
    ?}
    ?if(j>=t.len)
    ? v=i-t.len;/*返回匹配模式串的首字符下標*/
    ?else
    ? v=-1;
    ?return v;
    }

    void StrAssign(SqString &str,char cstr[])/*由串常量cstr創建串str */
    {
    ?? int i;
    ?? for(i=0;cstr[i]!='\0';i++)
    ??? str.ch[i]=cstr[i];
    ?? str.len=i;
    }

    void DispStr(SqString s)/*輸出串s的所有元素*/
    {
    ? int i;
    ? if(s.len>0)
    ? {
    ??? for(i=0;i<s.len;i++)
    ??printf("%c",s.ch[i]);
    ?printf("\n");
    ? }
    }
    void main()
    {
    ? int j;
    ? int next[MaxSize],nextval[MaxSize];
    ? SqString s,t;
    ? StrAssign(s,"abcabcdabcdeabcdefabcdefg");
    ? StrAssign(t,"abcdeabcdefab");
    ? printf("串s:");DispStr(s);
    ? printf("串t:");DispStr(t);

    ? printf("簡單匹配P算法:\n");
    ? printf("t在s中的位置:%d\n",Index(s,t));

    ? GetNext(t,next);
    ? GetNextval(t,nextval);
    ? printf(" j???? ");
    ? for(j=0;j<t.len;j++)
    ? {
    ?? printf("%4d",j);
    ? }
    ? printf("\n");
    ? printf("t[j]?? ");
    ? for(j=0;j<t.len;j++)
    ? printf("%4c",t.ch[j]);
    ? printf("\n");
    ? printf("next?? ");
    ? for(j=0;j<t.len;j++)
    ? printf("%4d",next[j]);
    ?? printf("\n");
    ??
    ?? printf("nextval");
    ?? for(j=0;j<t.len;j++)
    ?? printf("%4d",nextval[j]);
    ?? printf("\n");

    ?? printf("KMP算法:\n");
    ?? printf("t在s中的位置:%d\n",KMPIndex(s,t));

    ?? printf("改進的KMP算法:\n");
    ?? printf("t在s中的位置:%d\n",KMPIndex1(s,t));

    }

    結果如下:
    串s:abcabcdabcdeabcdefabcdefg
    串t:abcdeabcdefab
    簡單匹配P算法:
    t在s中的位置:7
    ?j??????? 0?? 1?? 2?? 3?? 4?? 5?? 6?? 7?? 8?? 9? 10? 11? 12
    t[j]????? a?? b?? c?? d?? e?? a?? b?? c?? d?? e?? f?? a?? b
    next???? -1?? 0?? 0?? 0?? 0?? 0?? 1?? 2?? 3?? 4?? 5?? 0?? 1
    nextval? -1?? 0?? 0?? 0?? 0? -1?? 0?? 0?? 0?? 0?? 5? -1?? 0
    KMP算法:
    t在s中的位置:7
    改進的KMP算法:
    t在s中的位置:7

    posted on 2006-10-31 18:50 matthew 閱讀(1493) 評論(0)  編輯  收藏 所屬分類: 數據結構與算法設計
    主站蜘蛛池模板: 国产亚洲视频在线观看| 免费观看黄网站在线播放| 亚洲AV无码XXX麻豆艾秋| 亚洲国产精品人久久| 免费成人午夜视频| 大学生高清一级毛片免费| 美女内射无套日韩免费播放 | 57pao国产成视频免费播放| 边摸边吃奶边做爽免费视频网站| 亚洲香蕉久久一区二区| 少妇中文字幕乱码亚洲影视| 亚洲综合无码精品一区二区三区| 国产成人无码区免费A∨视频网站| 在线观看成人免费视频不卡| 一级毛片免费不卡在线| 国产成人AV免费观看| 国产无限免费观看黄网站| 免费人成再在线观看网站| 国产精品亚洲精品爽爽| 亚洲AV无码一区二区三区性色| 亚洲午夜成激人情在线影院| 麻豆亚洲av熟女国产一区二| 亚洲第一AAAAA片| 亚洲AV无码第一区二区三区| 亚洲免费观看视频| 亚洲精品成人无限看| 国产AV无码专区亚洲AWWW| 久久亚洲国产精品123区| 亚洲精品国产va在线观看蜜芽| 午夜国产羞羞视频免费网站| 日本高清免费aaaaa大片视频| 日韩精品免费一区二区三区| 青草草在线视频永久免费| 免费毛片在线视频| 手机看片久久国产免费| 国产精品美女自在线观看免费 | wwwxxx亚洲| 亚洲精品无码专区| 亚洲Av无码国产一区二区| 欧美亚洲精品一区二区| 国产成人亚洲精品播放器下载|