1. 程式人生 > 實用技巧 >實驗三 串的模式匹配

實驗三 串的模式匹配

這個作業屬於哪個課程 https://edu.cnblogs.com/campus/qdu/DS2020
這個作業要求在哪裡 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11392
這個作業的目標 <串的模式匹配>
學號 2018204153

一、實驗目的
1、瞭解串的基本概念
2、掌握串的模式匹配演算法的實現

二、實驗預習
說明以下概念
1、模式匹配:模式匹配是資料結構中字串的一種基本運算,給定一個子串,要求在某個字串中找出與該子串相同的所有子串,這就是模式匹配。

2、BF演算法:暴風(Brute Force)演算法是普通的模式匹配演算法,BF演算法的思想就是將目標串S的第一個字元與模式串T的第一個字元進行匹配,若相等,則繼續比較S的第二個字元和 T的第二個字元;若不相等,則比較S的第二個字元和T的第一個字元,依次比較下去,直到得出最後的匹配結果。BF演算法是一種蠻力演算法。

3、KMP演算法:kmp演算法是一種改進的字串匹配演算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作。
它的核心是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現是通過一個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){
        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

執行結果:

四、實驗小結
瞭解了串的基本概念,掌握了串的模式匹配演算法的實現 。