基于字符串模式匹配算法的病毒感染检测问题——C语言实现。
2023-04-09 23:17:04 2KB 算法 数据结构
1
关于KMP_字符串模式匹配算法的教学课件,详细讲解了Kmp 的原理与不足和改进
1
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: int Index_BF ( char S [ ], char T [ ], int pos ) { /* 若串 S 中从第pos(S 的下标0≤pos S[0] != S[1],S[1] != S[2],所以S[1] != T[0],S[2] != T[0]. 还是从理论上间接比较了。 有人疑问又来了,你分析的是不是特殊轻况啊。 假设S不变,在S中搜索T=“abaabd”呢?答:这种情况,当比较到S[2]和T[2]时,发现不等,就去看next[2]的值,next[2]=-1,意思是S[2]已经和T[0] 间接比较过了,不相等,接下来去比较S[3]和T[0]吧。 假设S不变,在S中搜索T=“abbabd”呢?答:这种情况当比较到S[2]和T[2]时,发现不等,就去看next[2]的值,next[2]=0,意思是S[2]已经和T[2]比较过了,不相等,接下来去比较S[2]和T[0]吧。 假设S=”abaabcabdabba”在S中搜索T=“abaabd”呢?答:这种情况当比较到S[5]和T[5]时,发现不等,就去看next[5]的值,next[5]=2,意思是前面的比较过了,其中,S[5]的前面有两个字符和T的开始两个相等,接下来去比较S[5]和T[2]吧。 总之,有了串的next值,一切搞定。那么,怎么求串的模式函数值next[n]呢?(本文中next值、模式函数值、模式值是一个意思。) 三. 怎么求串的模式值next[n] 定义: (1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。 (2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符 相同,且j的前面的1—k个字符与开头的1—k 个字符不等(或者相等但T[k]==T[j])(1≤k0 但k #include int KMP(const char *Text,const char* Pattern) //const 表示函数内部不会改变这个参数的值。 { if( !Text||!Pattern|| Pattern[0]=='\0' || Text[0]=='\0' )// return -1;//空指针或空串,返回-1。 int len=0; const char * c=Pattern; while(*c++!='\0')//移动指针比移动下标快。 { ++len;//字符串长度。 } int *next=new int[len+1]; get_nextval(Pattern,next);//求Pattern的next函数值 int index=0,i=0,j=0; while(Text[i]!='\0' && Pattern[j]!='\0' ) { if(Text[i]== Pattern[j]) { ++i;// 继续比较后继字符 ++j; } else { index += j-next[j]; if(next[j]!=-1) j=next[j];// 模式串向右移动 else { j=0; ++i; } } }//while delete []next; if(Pattern[j]=='\0') return index;// 匹配成功 else return -1; } int main()//abCabCad { char* text="bababCabCadcaabcaababcbaaaabaaacababcaabc"; char*pattern="adCadCad"; //getNext(pattern,n); //get_nextval(pattern,n); cout<
2022-12-03 21:12:51 418KB c语言 数据结构 字符串模式匹配 算法
1
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。先来看一个简单匹配算法的函数:此算法的思想是直截了当的:将主串S中某个位置i起始的子串和模式串T相比较。即从j=0起比较S[i+j]与T[j],若相等,则在主串S中存在以i为起始位置匹配成功的可能性,继续往后比较(j逐步增1),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即将串T向后滑动一位,即i增1,而j退回至0,重新开始新一轮的匹配。例如:在串S=”abcabcabdabba”
1
本Word资源分为三个内容共6页(部分代码含注释):用串的顺序结构(数组)实现一段任意文本的单词个数的统计(详见注释)、比较BF算法和KMP算法(提供BF、KMP的完整算法)、运行结果截图。以下代码包含一些对字符串的基本操作,并展示了以上两个具体使用例子以及从运行时间上直观看出KMP算法的高效性。以下由C++程序设计语言编写的代码均已通过Dev-C++5.4.0和VS。为了防止误修改,文档已限制编辑(可复制),若想修改则密码是:1234。代码适合初学者和复习,仅供参考,学习时请养成独立思考的习惯。
这是一道经典算法题:若S和T是用结点大小为1的单链表存储的两个串,设计算法将S中首次与T匹配的子串逆置。 请大家仔细研究细节。
2021-10-02 21:43:58 2KB 单链表 字符串 模式匹配 逆置
1
7.5 字符串模式匹配 re 模块为高级字符串成处理提供了正则表达式匹配。 对于复杂的匹配和处理,正则表达式能够提供简明优 化的方法: >>> import re >>> re.findall(r’\bf[a-z]*’, ’which foot or hand fell fastest’) [’foot’, ’fell’, ’fastest’] >>> re.sub(r’(\b[a-z]+) \1’, r’\1’, ’cat in the the hat’) ’cat in the hat’ 当仅仅需要一些简单的功能时候,优先使用 string方法,因为它更容易读取和调试。 >>> ’tea for too’.replace(’too’, ’two’) ’tea for two’ 7.6 数学 数学模块为浮点数运算提供了对底层 C 函数库的访问支持。 >>> import math >>> math.cos(math.pi / 4) 0.70710678118654757 >>> math.log(1024, 2) 10.0 Random模块为生成随机选择提供了工具。 >>> import random >>> random.choice([’apple’, ’pear’, ’banana’]) ’apple’ >>> random.sample(range(100), 10) # sampling without replacement
2021-08-23 17:02:05 1.32MB Python3.2.3 翻译
1
C语言版本的字符串模式匹配,主要适用于学数据结构的孩纸,数据结构实验报告
2021-04-10 20:59:16 103KB 模式匹配
1
这是数据结构中的经典算法——KMP字符串模式匹配的详解,并且有相关的程序,保证受益匪浅。
2019-12-21 22:11:13 66KB KMP 模式匹配 数据结构
1
《数据结构(C语言版 第2版)》严蔚敏 实验四 基于字符串模式匹配算法的病毒感染检测问题,含实验报告
2019-12-21 21:49:37 152KB 数据结构实验 字符串模式匹配
1