[原创]《柔性字符串匹配》部分代码C实现

《柔性字符串匹配》
作者: (美)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章 正则表达式匹配
第6章 近似匹配
第7章 总结
参考文献
索引

本书的确是本好书,之前没事看了一下,里面只有核心伪码,有的更是模糊,实现上有些困难。
我只实现了部分,给大家分享啦。看不懂不要怪我,看书吧。现在看到这些已经实现的代码还是有些感慨的,有的一个都要花掉我一天的时间,比如:Wu_Manber。

当时在家里也没什么好的编译环境,只好用Turbo c2.0了,不过很容易移值到vc++上去的。
下面只展示Wu_Manber了

 

其伪码如下:

 

 

下面为算法实现:

 

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

你可能感兴趣的:(Algorithm,c,算法,struct,正则表达式,null)