串的模式匹配
阿新 • • 發佈:2020-11-01
串的模式匹配
這個作業屬於哪個課程 | https://edu.cnblogs.com/campus/qdu/DS2020 |
---|---|
這個作業要求在哪裡 | https://edu.cnblogs.com/campus/qdu/DS2020/homework/11392 |
這個作業的目標 | 瞭解串的基本概念和串的模式匹配演算法的實現 |
學號 | 2018204188 |
一.實驗目的
1.瞭解串的基本概念
2.掌握串的模式匹配演算法的實現
二.實驗預習
說明以下概念
-
模式匹配:串的模式匹配即子串定位,即查詢子串在主串中出現的位置,是一種重要的串的運算。設S是給定的主串,T是給定的子串,在主串S中查詢等於子串T的串的過程成為模式匹配,T稱為模式串。
-
BF演算法:BF演算法,即暴力(Brute Force)演算法,是普通的模式匹配演算法,BF演算法的思想就是將目標串S的第一個字元與模式串T的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和T的第二個字元;若不相等,則比較S的第二個字元和T的第一個字元,依次比較下去,直到得出最後的匹配結果。BF演算法是一種蠻力演算法。
-
KMP演算法:
KMP演算法是一種改進的字串匹配演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱KMP演算法)。KMP演算法的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到最快匹配的目的。具體實現就是通過一個next()函式實現,函式本身包含了模式串的區域性匹配資訊。KMP演算法的時間複雜度O(m+n)。
三.實驗內容和要求
1.閱讀並執行下面程式,根據輸入寫出執行結果。
#include<stdio.h> #include<string.h> #define MAXSIZE 100 typedef struct{ char data[MAXSIZE]; int length; }SqString; int strCompare(SqString *s1,SqString *s2); /*串的比較*/ void show_strCompare(); void strSub(SqString *s,int start,int sublen,SqString *sub); /*求子串*/ void show_subString(); int strCompare(SqString *s1,SqString *s2){ int i; for(i=0;i<s1->length&&i<s2->length;i++) if(s1->data[i]!=s2->data[i]) return s1->data[i]-s2->data[i]; return s1->length-s2->length; } void show_strCompare(){ SqString s1,s2; int k; printf("\n***show Compare***\n"); printf("input string s1:"); gets(s1.data); s1.length=strlen(s1.data); printf("input string s2:"); gets(s2.data); s2.length=strlen(s2.data); if((k=strCompare(&s1,&s2))==0) printf("s1=s2\n"); else if(k<0) printf("s1<s2\n"); else printf("s1>s2\n"); printf("\n***show over***\n"); } void strSub(SqString *s,int start,int sublen,SqString *sub){ int i; if(start<1||start>s->length||sublen>s->length-start+1){ sub->length=0; } for(i=0;i<sublen;i++) sub->data[i]=s->data[start+i-1]; sub->length=sublen; } void show_subString(){ SqString s,sub; int start,sublen,i; printf("\n***show subString***\n"); printf("input string s:"); gets(s.data); s.length=strlen(s.data); printf("input start:"); scanf("%d",&start); printf("input sublen:"); scanf("%d",&sublen); strSub(&s,start,sublen,&sub); if(sub.length==0) printf("ERROR!\n"); else{ printf("subString is :"); for(i=0;i<sublen;i++) printf("%c",sub.data[i]); } printf("\n***show over***\n"); } int main(){ int n; do { printf("\n---String---\n"); printf("1. strCompare\n"); printf("2. subString\n"); printf("0. EXIT\n"); printf("\ninput choice:"); scanf("%d",&n); getchar(); switch(n){ case 1:show_strCompare();break; case 2:show_subString();break; default:n=0;break; } }while(n); return 0; }
- 執行程式
- 輸入:
1
student
students
2
Computer Data Stuctures
10
4
- 執行結果:
2.實現串的模式匹配演算法。補充下面程式,實現串的BF和KMP演算法。
#include<stdio.h>
#include<string.h>
#define MAXSIZE 100
typedef struct{
char data[MAXSIZE];
int length;
}SqString;
int index_bf(SqString *s,SqString *t,int start);
void getNext(SqString *t,int next[]);
int index_kmp(SqString *s,SqString *t,int start,int next[]);
void show_index();
int index_bf(SqString *s,SqString *t,int start){
void getNext(SqString *t,int next[]);
int index_kmp(SqString *s,SqString *t,int start,int next[]);
void show_index();
int index_bf(SqString *s,SqString *t,int start){
int i,j,pos;
if(t->length==0)
return(0);
pos=start;
i=pos;
j=0;
while(i<s->length&&j<t->length)
if(s->data[i]==t->data[j])
{
i++;j++;
}
else
{
pos++;
i=pos;
j=0;
}
if(j>t->length)
return(pos);
else
return(-1);
}
void getNext(SqString *t,int next[]){
int i=0,j=-1;
next[0]=-1;
while(i<t->length){
if((j==-1)||(t->data[i]==t->data[j])){
i++;j++;next[i]=j;
}else
j=next[j];
}
}
int index_kmp(SqString *s,SqString *t,int start,int next[]){
int i,j;
if(t->length=0)
return(0);
while(i<s->length&&j<t->length)
if(s->data[i]==t->data[j])
{
i++;j++;
}
else
j=next[j];
if(j>=t->length)
return(i-j);
else
return(-1);
}
void show_index(){
SqString s,t;
int k,next[MAXSIZE]={0},i;
printf("\n***show index***\n");
printf("input string s:");
gets(s.data);
s.length=strlen(s.data);
printf("input string t:");
gets(t.data);
t.length=strlen(t.data);
printf("input start position:");
scanf("%d",&k);
printf("BF:\nthe result of BF is %d\n",index_bf(&s,&t,k));
getNext(&t,next);
printf("KMP:\n");
printf("next[]:");
for(i=0;i<t.length;i++)
printf("%3d",next[i]);
printf("\n");
printf("the result of KMP is %d\n",index_kmp(&s,&t,k,next));
printf("\n***show over***\n");
}
int main(){
show_index();
return 0;
}
- 輸入:
abcaabbabcabaacbacba
abcabaa
1
- 執行結果:
四.實驗小結
通過實驗,可以更深刻的理解串的概念,以及其模式匹配演算法,同時對BF演算法和KMP演算法的基本概念,基本結構也有更深刻的認識與理解。