精华内容
下载资源
问答
  • 严蔚敏 〈数据结构〉课程中有关于模式匹配算法的章节。这个程序实现了其中的代码。采用标准C编写。包含普通带带主串回溯的算法和KMP算法
  • 很经典,模式匹配大家都知道,但书上只有一般算法,这里是它的改进算法。
  • 模式匹配的kmp算法,可大大提高效率,时间复杂度仅为O(n*M),对于初学数据结构的有一定的帮助
  • 数据结构模式匹配算法 对输入的数字等进行匹配
  • 主要介绍了C语言数据结构模式匹配字符串定位问题的相关资料,希望通过本文能帮助到大家,让大家理解这部分内容,需要的朋友可以参考下
  • 主要介绍了C语言数据结构中串的模式匹配的相关资料,需要的朋友可以参考下
  • 很形象的模式匹配网页动态演示,适合数据结构初学者学习理解。
  • 数据结构模式匹配 KMP算法

    千次阅读 2019-03-13 21:23:26
    数据结构】 串 KMP算法实现 KMP算法应用于串的模式匹配中 普通模式匹配算法在进行匹配时需要频繁对主串指针进行回溯,KMP算法通过将模式向右滑动一段距离的方式避免了主串的回溯,同时降低了算法复杂度 ,由...

    【数据结构】 串 KMP算法实现


    KMP算法应用于串的模式匹配中


    普通模式匹配算法在进行匹配时需要频繁对主串指针进行回溯,KMP算法通过将模式向右滑动一段距离的方式避免了主串的回溯,同时降低了算法复杂度 ,由原来的O(n*m)变为O(n)。

    KMP算法本身比较容易理解,就是对模式串本身的结构进行分析,在匹配过程中跳过一些不必要的步骤。
    比如当模式串为ababc; 主串为ababdddd时; 匹配进行到第五个字符处时失败了,但是这时主串指针不必进行回退(又重新从第二个字符b处开始比较),只需要根据模式串的 nest 函数,将模式指针进行移动,再进行下一次判断。
    在这里插入图片描述


    next函数求解

    KMP算法难以理解的点在于 next 函数的求解
    要弄明白一些基本的东西:
    在比较的过程中,存在着两个指针,

    1. 主串指针,指向当前主串正在进行比较的字符
    2. 模式串指针,指向模当前正在匹配的模式串的字符位置
      在使用KMP算法时,主串是不会进行回溯的,只有右移操作,主要是对模式串指针的滑动操作。

    算了,写不下去了

    弄懂之后才知道为什么书上写得那么晦涩难懂了。因为实在是很难说明白

    1.递推

    2.这个问题可以看成一个模式匹配问题,整个模式串既是主串,又是模式串。

    3.在求解 next【n+1】的过程中,其实还是在进行模式匹配,可以通过已知的next来获得next【n+1】

    4.后面的优化:对于 第 j 个字符 ,如果与next [ j ]所指示的字符相等,那么 next [ j ] = next [ next[j] ].


    想要理解整个算法,建议自己照着书上的思路走一遍,写一遍代码,模拟整个函数的执行过程,差不多懂了之后再回过头看看定义 (网上很多详解都没有把整个思路讲清,还得自己悟)

    代码部分:

    下面是KMP算法的实现,代码中串采用堆分配存储表示,书中串的存储方式为定长顺序串,代码略有区别

    1.采用KMP算法的模式匹配函数
    int Index_KMP(HString S, HString T, int pos,int next[]) {
    	//利用模式串T的next函数求T在主串中第pos个字符之后的位置的KMP算法。
    	int i = pos;
    	int j = 0;
    	while (i<S.length&&j<T.length)
    	{
    		if (j == -1 || S.ch[i] == T.ch[j]) { ++i; ++j; }
    		else
    		{
    			j = next[j];
    		}
    	}
    	if (j >= T.length)return i - T.length+1;	//匹配成功
    	else return -1;								//输出-1失败
    }
    

    2.KMP算法中next函数求取过程

    void get_next(HString T, int next[]) {
    	//求模式串T的next函数值并存入数组next
    	int i = 0; next[0] = -1; int j = -1;
    	while (i < T.length-1) {
    		if (j == -1 || T.ch[i] == T.ch[j]) { ++i; ++j; next[i] = j; }
    		else
    		{
    			j = next[j];
    		}
    	}
    	//get_next
    }
    

    3.next函数求取优化

    void get_nextval(HString T, int nextval[]) {
    	int i = 0; nextval[0] = -1; int j = -1;
    	while (i < T.length - 1) {
    		if (j == -1 || T.ch[i] == T.ch[j]) { 
    			++i; ++j;
    			if (T.ch[i] != T.ch[j])nextval[i] = j;
    			else nextval[i] = nextval[j];
    		}
    		else
    		{
    			j = nextval[j];
    		}
    	}
    	//get_nextval
    }
    

    4.测试部分

    #include"String.h"
    #include"KMP.h"
    using namespace std;
    
    void StrDisplay(HString S) {
    	//显示串
    	for (int i = 0; i < S.length; i++)
    	{
    		cout << S.ch[i];
    	}
    }
    int main() {
    	HString A;
    	StrInit(A);
    	HString B;
    	StrInit(B);
    	HString C;
    	StrInit(C);
    	char b[20] = "ababbbabaabcaccc";
    	char c[10] = "abaabcac";
    	int next[10] = { -1,0,0,1,1,2,0,1 };
    	cout << "初始化B,显示B:" << endl;
    	StrAssigh(B, b);
    	StrDisplay(B);
    
    	cout << endl<<"初始化C,显示C:" << endl;
    	StrAssigh(C, c);
    	StrDisplay(C);
    	
    	cout << endl << "对B,C串进行模式匹配:"<<endl;
    	cout << Index_KMP(B, C, 1, next) << endl;
    	cout << "输出C的next函数:" << endl;
    	get_next(C, next);
    	for (int  i = 0; i < 8; i++)
    	{
    		cout << next[i]<<" ";
    	}
    	cout << endl;
    	cout << "输出改进后C的next函数:" << endl;
    	get_nextval(C, next);
    	for (int i = 0; i < 8; i++)
    	{
    		cout << next[i]<<" ";
    	}
    	system("pause");
    }
    

    结果

    在这里插入图片描述

    注:使用堆串实现,与书中结果相差1 (因为堆串的首地址是有值的,定长顺序串首地址 放的是串长)

    展开全文
  • 串的模式匹配,适用于大学数据结构上机实验课 可编译通过~~~没有问题
  • 数据结构 c 字符串的模式匹配 简单算法以及KMP算法
  • 该文档描述了数据结构的串的相关知识,朴素的模式匹配,KMP模式匹配,相关的概念,基本知识和代码的实现
  • 数据结构与算法实验指导 V2017 常熟理工学院 数据结构与算法实验指导与报告书 _2017-2018_学年 第_1_ 学期 专 业 物联网工程 实验名称 串与模式匹配 实验地点 N6-210 指导教师 聂盼红 计算机科学与工程学院 2017 ...
  • 数据结构—串的模式匹配.doc
  • 和大家一起分享数据结构中串的模式匹配!写的很好!希望大家喜好!我们一起加油努力!
  • C/C++实现串匹配算法,包括源代码和实验报告。实现了串的创建,查看,修改,朴素的模式匹配算法,kmp算法和kmp改进算法。
  • 数据结构 串的模式匹配算法BF、KMP

    千次阅读 2019-01-12 02:27:32
    目录 串的模式匹配 朴素的模式匹配算法(BF(BruteForce)算法) ...模式匹配数据结构中字符串的一种基本运算,给定一个子串,要求在某个字符串中找出与该子串相同的所有子串,这就是模式匹配。 假设P是...
    展开全文
  • 数据结构实现顺序串的各种模式匹配算法 注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据 涉及基本运算流程 建立目标串s=abcabcdabcdeabcdeabcdefabcdefg 和模式串 t =abcdeabcdefab ...

    数据结构实现顺序串的各种模式匹配算法

    注意:本代码为了测试运行默认含有操作所需数据,如有需要可自己增删改相关数据

    涉及基本运算流程

    1. 建立目标串s=abcabcdabcdeabcdeabcdefabcdefg 和模式串 t =abcdeabcdefab
    2. 采用简单匹配算法求t在s中的位置
    3. 由模式串t求出next数组值和nextval数组值
    4. 采用KMP算法求t在s中的位置
    5. 采用改进的KMP算法t在s中的位置

    GitHub地址(包含.cpp文件和可执行程序exe)

    我的数据结构GitHub地址

    源代码(经VS2015、devC++编译器运行通过)

    #include "string.h"
    #include "stdio.h"    
    #include "stdlib.h"   
    #include "io.h"  
    #include "math.h"  
    #include "time.h"
    
    #define OK 1
    #define ERROR 0
    #define TRUE 1
    #define FALSE 0
    #define MAXSIZE 100 /* 存储空间初始分配量 */
    
    typedef int Status;		/* Status是函数的类型,其值是函数结果状态代码,如OK等 */
    typedef int ElemType;	/* ElemType类型根据实际情况而定,这里假设为int */
    
    typedef char String[MAXSIZE + 1]; /*  0号单元存放串的长度 */
    
    								  /* 生成一个其值等于chars的串T */
    Status StrAssign(String T, char *chars)
    {
    	int i;
    	if (strlen(chars)>MAXSIZE)
    		return ERROR;
    	else
    	{
    		T[0] = strlen(chars);
    		for (i = 1; i <= T[0]; i++)
    			T[i] = *(chars + i - 1);
    		return OK;
    	}
    }
    
    Status ClearString(String S)
    {
    	S[0] = 0;/*  令串长为零 */
    	return OK;
    }
    
    /*  输出字符串T。 */
    void StrPrint(String T)
    {
    	int i;
    	for (i = 1; i <= T[0]; i++)
    		printf("%c", T[i]);
    	printf("\n");
    }
    
    /*  输出Next数组值。 */
    void NextPrint(int next[], int length)
    {
    	int i;
    	for (i = 1; i <= length; i++)
    		printf("%d", next[i]);
    	printf("\n");
    }
    
    /* 返回串的元素个数 */
    int StrLength(String S)
    {
    	return S[0];
    }
    
    /* 朴素的模式匹配法 */
    int Index(String S, String T, int pos)
    {
    	int i = pos;	/* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
    	int j = 1;				/* j用于子串T中当前位置下标值 */
    	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
    	{
    		if (S[i] == T[j]) 	/* 两字母相等则继续 */
    		{
    			++i;
    			++j;
    		}
    		else 				/* 指针后退重新开始匹配 */
    		{
    			i = i - j + 2;		/* i退回到上次匹配首位的下一位 */
    			j = 1; 			/* j退回到子串T的首位 */
    		}
    	}
    	if (j > T[0])
    		return i - T[0];
    	else
    		return 0;
    }
    
    /* 通过计算返回子串T的next数组。 */
    void get_next(String T, int *next)
    {
    	int i, j;
    	i = 1;
    	j = 0;
    	next[1] = 0;
    	while (i<T[0])  /* 此处T[0]表示串T的长度 */
    	{
    		if (j == 0 || T[i] == T[j]) 	/* T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 */
    		{
    			++i;
    			++j;
    			next[i] = j;
    		}
    		else
    			j = next[j];	/* 若字符不相同,则j值回溯 */
    	}
    }
    
    /* 返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0。 */
    /*  T非空,1≤pos≤StrLength(S)。 */
    int Index_KMP(String S, String T, int pos)
    {
    	int i = pos;		/* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
    	int j = 1;			/* j用于子串T中当前位置下标值 */
    	int next[255];		/* 定义一next数组 */
    	get_next(T, next);	/* 对串T作分析,得到next数组 */
    	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
    	{
    		if (j == 0 || S[i] == T[j]) 	/* 两字母相等则继续,与朴素算法增加了j=0判断 */
    		{
    			++i;
    			++j;
    		}
    		else 			/* 指针后退重新开始匹配 */
    			j = next[j];/* j退回合适的位置,i值不变 */
    	}
    	if (j > T[0])
    		return i - T[0];
    	else
    		return 0;
    }
    
    /* 求模式串T的next函数修正值并存入数组nextval */
    void get_nextval(String T, int *nextval)
    {
    	int i, j;
    	i = 1;
    	j = 0;
    	nextval[1] = 0;
    	while (i<T[0])  /* 此处T[0]表示串T的长度 */
    	{
    		if (j == 0 || T[i] == T[j]) 	/* T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 */
    		{
    			++i;
    			++j;
    			if (T[i] != T[j])      /* 若当前字符与前缀字符不同 */
    				nextval[i] = j;	/* 则当前的j为nextval在i位置的值 */
    			else
    				nextval[i] = nextval[j];	/* 如果与前缀字符相同,则将前缀字符的 */
    											/* nextval值赋值给nextval在i位置的值 */
    		}
    		else
    			j = nextval[j];			/* 若字符不相同,则j值回溯 */
    	}
    }
    
    int Index_KMP1(String S, String T, int pos)
    {
    	int i = pos;		/* i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配 */
    	int j = 1;			/* j用于子串T中当前位置下标值 */
    	int next[255];		/* 定义一next数组 */
    	get_nextval(T, next);	/* 对串T作分析,得到next数组 */
    	while (i <= S[0] && j <= T[0]) /* 若i小于S的长度并且j小于T的长度时,循环继续 */
    	{
    		if (j == 0 || S[i] == T[j]) 	/* 两字母相等则继续,与朴素算法增加了j=0判断 */
    		{
    			++i;
    			++j;
    		}
    		else 			/* 指针后退重新开始匹配 */
    			j = next[j];/* j退回合适的位置,i值不变 */
    	}
    	if (j > T[0])
    		return i - T[0];
    	else
    		return 0;
    }
    
    int main()
    {
    	int i, *p;
    	String s1, s2;
    	String s, t;
    
    	/*建立目标串s = abcabcdabcdeabcdeabcdefabcdefg和模式串t = abcdeabcdefab*/
    	StrAssign(s, "abcabcdabcdeabcdeabcdefabcdefg");
    	StrAssign(t, "abcdeabcdefab");
    	printf("1.建立目标串s和模式串t成功\n");
    
    	/*采用简单匹配算法(朴素模式匹配)求t在s中的位置*/
    	int index1 = Index(s, t, 1);
    	printf("2.t在s中的位置:%d", index1);
    
    	/*由模式串t求出next数组值和nextval数组值*/
    	printf("\n3.由模式串t求出next数组值和nextval数组值: 开始执行\n");
    	i = StrLength(t);
    	p = (int*)malloc((i + 1) * sizeof(int));
    	get_next(t, p);
    	printf(".Next为: ");
    	NextPrint(p, StrLength(t));
    
    	printf(".NextVal为: ");
    	get_nextval(t, p);
    	NextPrint(p, StrLength(t));
    
    	/*采用KMP算法求t在s中的位置*/
    	int len = 
    	Index_KMP(s, t, 1); 
    	printf("4.采用KMP算法求t在s中的位置:%d", len);
    
    	/*采用改进的KMP算法求t在s中的位置*/
    	int len1 =
    		Index_KMP1(s, t, 1);
    	printf("\n5.采用改进的KMP算法求t在s中的位置:%d", len1);
    
    	system("pause") ; 
    
    
    
    	return 0;
    }
    
    
    
    
    展开全文
  • 数据结构 串BF模式匹配算法作业

    千次阅读 2020-05-28 15:41:42
    键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。要求:匹配成功,输出位序,匹配不成功,显示相应提示信息。 例如:s=“aaaabcdcccc”,t=“abcd”。 因为程序很简单,所以就...

    题目要求
    键盘输入目标串(主串)s、模式串(子串)t,编写程序,实现顺序串的BF模式匹配算法。要求:匹配成功,输出位序,匹配不成功,显示相应提示信息。
    例如:s=“aaaabcdcccc”,t=“abcd”。
    因为程序很简单,所以就直接亮出完整代码,后续会发布一个串的一系列操作

    完整代码

    #include <stdio.h>
    #define Max 200
     
    typedef struct
     {
    	 char data[Max];
    	 int length;
     }Sqstring;
    
    char str1[Max];
    char str2[Max];
    
    void Strassign(Sqstring &s,char str[])
    {
    	int i;
    	for(i=0;str[i]!='\0';i++)
    		s.data[i]=str[i];
    	s.length=i;
    }
    
    int index(Sqstring s,Sqstring t)
    {
    	int i=0,j=0;
    	while(i<s.length&&j<t.length)
    	{
    		if(s.data[i]==t.data[j])
    		{
    			i++;
    			j++;
    		}
    		else
    		{
    			i=i-j+1;
    			j=0;
    		}
    	}
    	if(j>=t.length)
    		return (i-t.length);
    	else
    		return -1;
    }
    
    int main()
    {
    	Sqstring s1,s2;
    	printf("请输入第一个字符串\n");
    	scanf("%s",str1);
    	Strassign(s1,str1);
    	printf("请输入第二个字符串\n");
    	scanf("%s",str2);
    	Strassign(s2,str2);
    	if(index(s1,s2)==-1)
    		printf("匹配不成功\n");
    	else
    		printf("匹配的第一个字符的下标为:%d\n",index(s1,s2));
    	return 0;
    }
    
    展开全文
  • 数据结构 串的模式匹配

    千次阅读 2020-05-05 16:58:00
    全部每周作业和视频思考题答案和解析 见浙江大学 数据结构 思考题+每周练习答案 题目一:若给定文本长度为 n,模式长度为 m,则库函数 strstr 的最坏时间复杂度是: A. O(nm) B. O(n) C. O(m) D....
  • 数据结构之字符串模式匹配

    千次阅读 2018-05-18 22:44:09
    1.引入 字符串模式匹配。首先我们引入目标串,模式串的概念,而字符串模式匹配就是查找模式串在目标串中的位置。2.brute-Force算法 brute-Force算法,我的理解是这样的。首先设目标串target="t0t1t2t3t4"...
  • 数据结构——串的模式匹配算法

    千次阅读 2017-05-10 18:11:09
    2、串的模式匹配算法  串的查找操作也称作串的模式匹配操作,模式匹配操作的具体含义是:在主串(也称作目标串)中,从位置start开始查找是否存在子串(也称作模式串),如在主串中查找到一个与模式串相同的子串,...
  • 数据结构 — 3.模式匹配

    千次阅读 2015-10-27 17:36:52
    【问题描述】试编写一个算法,识别依次读入的一个以@为结束符的字符序列是否为形如"序列1&序列2"模式的字符序 列. 其中序列1和序列2中都不含字符'&',且序列2是序列1的逆序.例如,"a+b&b+a"是属于该模式的字符序列则输 ...
  • 由此引入改进的模式匹配算法——KMP模式匹配算法。 五、KMP模式匹配算法 1. 算法关键  如果主串S= “abcdefgab”,子串T= “abcdex”,用上面的朴素算法 的话,前5个字母,两串完全相等,直到第6...
  • C/C++/Java代码 朴素的(暴力法)模式匹配算法 数据结构
  • 编程实现如下功能: 1、在实验六的基础上,实现串的Brute-Force模式匹配算法。 2、尝试实现串的KMP模式匹配算法。
  • BF全称为Brute-Force,最简单直观的模式匹配算法。 1.算法思想 两个字符串进行匹配时,一个主串和一个模式串,就是按照我们最容易想到的算法来进行匹配。用两个变量i,j分别记录主串和模式串的匹配位置,如果两者在...
  • 对于串的操作,匹配指定字符,返回在串中的字数。两种方法的对比,深入了解算法的特性。
  • 数据结构:第四章串的模式匹配.ppt
  • 本文针对数据结构基础系列网络课程(4):串中第5课时串的模式匹配(Brute-Force算法)。问题:模式匹配,设有主串s和子串t,在主串s中找到一个与子串t相等的子串。 解答:#include #include "sqString.h"int index...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 316,345
精华内容 126,538
关键字:

数据结构模式匹配

数据结构 订阅