[原創]《柔性字串匹配》部分代碼C實現

來源:互聯網
上載者:User

《柔性字串匹配》
作者: (美)Gonzalo Navarro  Mathieu Raffinot 

叢書名: 國外電腦科學教材系列

出版社:電子工業出版社

本書是一本不可多得的字串匹配方面的專業書籍。書中對串匹配問題進行了系統化的分類,從實際效果出發,著重詳細介紹了串匹配領域內效果最好的若干種演算法。並且給出了具有統一介面的演算法偽碼,使讀者能清晰理解演算法原理,易於實現演算法編程,從而提高專業水平。此外,書中通過嚴謹的理論分析和大量實驗資料,說明了每種演算法在實際應用中的適用範圍,由此提供了良好的應用指導,解決了串匹配演算法的最佳適用性問題。
本書可協助本領域的研究人員從整體上把握字串匹配方面的脈絡,而其他相關領域的人員也可藉助本書非常清晰地瞭解串匹配問題的概況。
目錄
第1章 導言
 1.1 本書的目的和側重點
 1.2 概況
 1.3 基本概念
第2章 字串匹配
 2.1 基本概念
 2.2 基於首碼搜尋的方法
 2.3 基於尾碼搜尋的方法
 2.4 實驗圖
 2.5 其他演算法和參考文獻
第3章 多字串匹配
 3.1 基本概念
 3.2 基於首碼搜尋的方法
 3.3 基於尾碼搜尋的方法
 3.4 基於子串搜尋的方法
 3.5 實驗圖
 3.6 其他演算法和文獻
第4章 擴充字元串匹配
 4.1 基本概念
 4.2 字元組
. 4.3 限長空位
 4.4 可選字元
 4.5 萬用字元和重複字元
 4.6 多模式串搜尋
 4.7 其他演算法和參考文獻
第5章 Regex匹配
第6章 近似匹配
第7章 總結
參考文獻
索引

本書的確是本好書,之前沒事看了一下,裡面只有核心偽碼,有的更是模糊,實現上有些困難。
我只實現了部分,給大家分享啦。看不懂不要怪我,看書吧。現在看到這些已經實現的代碼還是有些感慨的,有的一個都要花掉我一天的時間,比如:Wu_Manber。

當時在家裡也沒什麼好的編譯環境,只好用Turbo c2.0了,不過很容易移值到vc++上去的。
下面只展示Wu_Manber了

 

其偽碼如下:

 

 

下面為演算法實現:

 

/*Wu Manber's algorithm<br /> *By G_Spider 2010-2-5 19:30<br /> * Turbo c2.0<br /> */<br />#include<stdio.h><br />#include<stdarg.h><br />#include<string.h><br />#include<stdlib.h> /*void _Cdecl _exit(int status);EXIT_SUCCESS=0;EXIT_FAILURE=1*/<br />#define ASIZE 95<br />#define MAX 32<br />#define B 2 /*SHIFT所佔空間為ASIZE^B */<br />typedef struct hash{<br /> char H[B];<br /> int r;<br /> char *dest;<br /> struct hash *next;<br />}*HASH;</p><p>int Len[MAX];<br />int SHIFT[ASIZE][ASIZE];<br />HASH head;<br />int preShfHash(char *s,...)<br />{<br /> char *p=s;<br /> int i=0,j,Lmin=1000;<br /> va_list args;<br /> HASH h;<br /> va_start(args,s);<br /> while(p!=NULL)<br /> {<br /> Len=strlen(p);<br /> Lmin=(Lmin<Len ?Lmin:Len);<br /> i++;<br /> p=va_arg(args,char*);<br /> }<br /> for(i=0;i<ASIZE;i++)<br /> for(j=0;j<ASIZE;j++)<br /> SHIFT[j]=Lmin-B+1;</p><p> p=s;<br /> va_start(args,s);<br /> if( (head=(HASH)malloc(sizeof(struct hash)))==NULL )<br /> _exit(EXIT_FAILURE);<br /> h=head;<br /> j=0;<br /> while(p!=NULL)<br /> {<br /> for(i=0;i<Len[j]-1;i++)<br /> {<br /> SHIFT[*(p+i)-32][*(p+i+1)-32]=<br /> (SHIFT[*(p+i)-32][*(p+i+1)-32]<(Len[j]-i-2)) ? SHIFT[*(p+i)-32][*(p+i+1)-32] : (Len[j]-i-2);<br /> }</p><p> for(i=B;i>0;i--)<br /> {<br /> h->H[B-i]=*(p+Len[j]-i);<br /> }<br /> h->r=j;<br /> h->dest=p;<br /> if( (h->next=(HASH)malloc(sizeof(struct hash)))==NULL )<br /> _exit(EXIT_FAILURE);<br /> h=h->next;<br /> j++;<br /> p=va_arg(args,char*);<br /> }<br /> h->H[0]=h->H[1]=255;<br /> h->r=1000;<br /> h->dest=NULL;<br /> h->next=NULL;<br /> va_end(args);<br /> return Lmin;<br />}<br />void Wu_Manber(int lmin,char *source)<br />{<br /> int pos,lag=0;<br /> int n=strlen(source);<br /> int i,j;<br /> HASH p;<br /> /*Searching*/<br /> pos=lmin;<br /> while(pos<=n)<br /> {<br /> /* B=2 */<br /> if(SHIFT[*(source+pos-B)-32][*(source+pos-1)-32]==0)<br /> {<br /> p=head;<br /> while(p!=NULL)<br /> {<br /> for(i=B-1,j=1;i<B;i++,j++)<br /> {<br /> if(p->H[i-1]==*(source+pos-j-1) && p->H==*(source+pos-j))<br /> { lag=1;<br /> break;<br /> }<br /> }<br /> if(lag==1)<br /> {<br /> for(i=pos-1,j=Len[p->r]-1;j>=0;j--,i--)<br /> if(*(p->dest +j)!=*(source+i))<br /> { lag=0;<br /> break;<br /> }<br /> }<br /> if(lag==1)<br /> {<br /> /*成功匹配*/<br /> printf("/nLocal Source_String is %d. Match_String is ",pos-Len[p->r]+1);<br /> for(i=0;i<Len[p->r];i++)<br /> {<br /> printf("%c",*(source+pos-Len[p->r]+i));<br /> }<br /> printf("/n");<br /> }</p><p> lag=0;<br /> p=p->next;<br /> }<br /> pos+=1;<br /> }<br /> else<br /> pos+=(SHIFT[*(source+pos-B)-32][*(source+pos-1)-32]);</p><p> }<br />}</p><p>void main()<br />{<br /> /*測試1*/<br /> /*<br /> char *source="CPM_annual_conference_announce_goodluckannounced";<br /> char *dest0="announce";<br /> char *dest1="annual";<br /> char *dest2="annually";<br /> */<br /> /*測試2*/<br /> char *source="AGATACGATATATAC";<br /> char *dest0="ATATATA";<br /> char *dest1="TATAT";<br /> char *dest2="ACGATAT";<br /> int lmin;<br /> lmin=preShfHash(dest0,dest1,dest2,NULL);<br /> Wu_Manber(lmin,source);</p><p>}</p><p>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.