本文为原书数据结构(c++语言版)第11章的代码
第一节
问题分类
模式检测 ,模式定位,模式计数,模式枚举
第二节 暴力算法
int match(char *P,char *T){//Brute-force-1
size_t n=strlen(T),i=0;
size_t m=strlen(P),j=0;
while(i<n&&j<m)
if(P[i]==T[j]) i++,j++;
else i-=j-1,j=0;
return i-j;
}
int match(string P,string T){//brute-force-3
size_t n=P.size(),i;
size_t m=T.size();
for(i=0;i<n-m+1;i++){
size_t j=0,tmp=i;
while(j<m&&tmp<n&&T[tmp]==P[j])
tmp++,j++;
if(tmp>=m) break;
}
return i;
}
int match(char *P,char *T){//brute-force-
size_t n=strlen(T),i=0;
size_t m=strlen(P),j=0;
for(i=0;i<n-m+1;i++){
for(j=0;j<m;j++)
if(T[i+j]!=P[j]) break;
if(j>=m) break;
}
return i;
}
第三节 kmp算法
</pre><pre name="code" class="html">int match(char *P,char *T){//kmp
int *next=buildNext(P);
int n=(int)strlen(T),i=0;
int m=(int)strlen(P),j=0;
while(i<n&&j<m)
if(0>j||T[i]==P[j]) i++,j++;
else j=next[j];
delete []next;
return i-j;
}
int *buildNext(char *P){
size_t m=strlen(P),j=0;
int *N=new int[m];
int t=N[0]=-1;
while(j<m-1)
if(0>t||P[j]==P[t]){
j++,t++;
N[j]=(P[j]!=P[t]?t:N[t]);//可改进 改进前 N[j]=t;
}
else
t=N[j];
return N;
}
第四节 bm算法 信息量有点大 没看
第五节 Karp-Rabin or Rabin-Karp 算法
/karp-Rabin or Rabin-karp
#ifndef M
#define M 97
#endif // M
#ifndef R //基数 这里取10
#define R 10
#endif // R
#define DIGIT(S,i) ((S)[i]-'0')
typedef long long HashCode
bool check1b1(char *P,char *T,size_t i);
HashCode prepareDm(size_t m);
void updateHash(HashCode &hashT,char *T,size_t m,size_t k,HashCode Dm);
int match(char *P,char *T){
size_t m=strlen(P),n=strlen(T);//assert:0<m<=n
Hashcode Dm=prepareDm(m),hashP=0,hashT=0;
for(size_t i=0;i<m;i++){
hashP=(hashP*R+DIGIT(P,i))%M;
hashT=(hasht*R+DIGIT(T,i))%M;
}
for(size_t k=0;;){
if(hashT==hashT)
if(check1b1(P,T,k)) return k;
if(++k>n-m) return k;//assert:k>n-m express no matching
else updateHash(hashT,T,m,k,Dm);//otherwise,update sub-hashcode,continue to find
}
}
bool check1b1(char *P,check *T,size_t i){
for(size_t m=strlen(P,j=0;j<m;j++)
if(p[i]!=T[j])
return false;
return true;
}
void updateHash(HashCode& hashT,char *T,size_t m,size_t k,HashCode Dm){
hashT=(hashT-DIGIT((T,k-1))*Dm)%M;
hashT=(hashT*R+DIGIT(T,k+m-1))%M;
if(0>hashT) hashT+=M;
}
HashCode prepareDm(size_t m){ // calculate R^m-1 %M
HashCode Dm=1;
for(size_t i=1;i<m;i++)
Dm=(R*Dm)%M;
return Dm;
}
int main(){
cout << "Hello world!" << endl;
return 0;
}