第五次作业

第五次作业

 
这个作业属于哪个课程https://edu.cnblogs.com/campus/qdu/DS2020/
这个作业要求在哪里 https://edu.cnblogs.com/campus/qdu/DS2020/homework/11392
这个作业的目标 <了解串的基本概念,掌握串的格式运算>
学号

2018204251

一、实验目的
1、了解串的基本概念
2、掌握串的模式匹配算法的实现

二、实验预习
说明以下概念
1、模式匹配:模式匹配是数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串。假设P是给定的子串,T是待查找的字符串,要求从T中找出与P相同的所有子串,这个问题成为模式匹配问题。如果T中存在一个或多个模式为P的子串,就给出该子串在T中的位置,称为匹配成功;否则匹配失败。
2、BF算法:BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法
3、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;
} 

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=start;
  int j=0;
  while(s->data[i]!='\0'&&t->data[j]!='\0'){
  	if(s->data[i]=t->data[j]){
  		i++;
  		j++;
	  }
	  else{
	  	start++;
	  	i=start;
	  	j=0;
	  }
  } 
  if(t->data[j]=='\0') return start+1;
  else return 0;
}
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[]){
  const int len=t->length;
  next[0]=-1;
  int j=0;
  int k=-1;
  while (j<len-1){
  if (k==-1 || t->data[j]==t->data[k])
  {
 
  j=j+1;
  k=k+1;
  next[j]=k; }
  else 
   k=next[k];
   }
 SqString *vec;
 int p=0;
 int q=0;
 while(p<s->length&&q<t->length){
 	if(q==-1||s->data[p]==t->data[q])
  {
	++p;
	++q;
 } 
 else
 q=next[q];
 if(q==t->length){
    vec->data[p-q];
 	j=-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;
}

四、 实验小结
本实验在原有的程序架构下,补充了BF算法和KMP算法的程序,重点在于BF算法和KMP算法的学习与运用.

posted @ 2020-11-04 19:31  沐风∝  阅读(179)  评论(0编辑  收藏  举报