模式匹配算法的原理及应用.

Slides:



Advertisements
Similar presentations
第五节 函数的微分 一、微分的定义 二、微分的几何意义 三、基本初等函数的微分公式与微分运算 法则 四、微分形式不变性 五、微分在近似计算中的应用 六、小结.
Advertisements

1 門市服務丙級技術士 技能檢定介紹 門市服務丙級技術士報告注意事項 證照名稱:門市服務丙級技術士 發照單位:行政院勞工委員會 有效期限:終生有效 考照時間:每年一次,皆為第一梯次 1. 簡章與報名書表發售時間:每年 1 月 2. 報名時間:每年 1 月。 3. 學科考試時間:每年 3.
生源地助学贷款系统还款功能优化说明 评审三局 2015年5月.
兵车行 杜甫 福州十一中语文组 林嵘臻.
我们向往新的飞翔 青岛顺兴路小学.
小猪.
聚焦文化竞争力.
二、信用工具和外汇.
综合实践活动 设计与实践案例 ——《感恩父母》主题班会.
为您扬帆,助您远航! 徽商银行特色新产品介绍. 为您扬帆,助您远航! 徽商银行特色新产品介绍.
“三生教育”专题 生命·生存·生活.
概其要、析其理 ——议论文事实论据修改 昌平二中 王丽娟
“悦”读,飞越 “考场” 心神飞越 温州中学 郑可菜.
公务卡使用说明.
“八皇后”问题 崔萌萌 吕金华.
财务知识培训 杨 秀 玲 2014年10月.
寻觅节日诗情.
第一章会计技能的内容 1.1会计技能的重要性.
C语言程序设计.
屏東縣105年度 友善校園事務與輔導工作- 國中適性輔導工作專業知能研習(初階課程) 桌遊在班級經營與學生輔導 之應用與連結
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
第四章 串 2018/11/13.
第4章 串 串的基本概念和C语言的串函数 串的存储结构 动态数组实现的顺序串 串的模式匹配算法——BF算法 主要知识点.
数据结构 Data Structure 主讲人:王国军,郑瑾 中南大学 中南大学信息院计科系
高级语言程序设计 主讲人:陈玉华.
Zn 模式匹配与KMP算法 Zn
第4章 串、数组和广义表 丽水学院工学院.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
数据结构 第4章 串.
第四章 串和数组(一) 1/.
第2讲 绪论(二).
第4章 串 4.1 串的基本概念及其抽象数据 4.2 串的存储结构 4.3 串类 4.4 串的模式匹配算法.
主題:踏出宣教路 使12:11 彼得醒悟過來,說:「我現在真知道主差遣 他的使者,救我脫離希律的手和猶太百姓一
数 据 结 构 Ch.4 串 计 算 机 学 院 肖明军
第二章 程序的灵魂--算法.
4.1 串的抽象数据类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法.
第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.3 串的模式匹配.
动态规划(Dynamic Programming)
数据结构概论 第4章 串 董黎刚 浙江工商大学信电学院 2019年1月18日.
第四章串 4.1 串类型定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例.
第四章 串.
計數式重複敘述 for 迴圈 P
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 字符串应用 5.4 字符串匹配算法 5.5 数组
第四章 串.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
顺序表的删除.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
第一章 程序设计和C语言 主讲人:高晓娟 计算机学院.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 字符串应用 5.4 字符串匹配算法 5.5 数组
5.1 串的基本概念 5.2 串的存储结构 5.3 串的基本运算 5.4 模式匹配 5.5 串在文本编辑中的应用
数 据 结 构 刘家芬 Sept 2012.
第四章 串和数组 4.1 串的定义* 4.2 串的表示和实现* 4.3 数组 4.4 数组的压缩.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
C qsort.
3.16 枚举算法及其程序实现 ——数组的作用.
第二章 类型、对象、运算符和表达式.
第七、八次实验要求.
問題解決與流程圖 高慧君 台北市立南港高中 2006年12月22日.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
字符串模式匹配- KMP 主讲:朱佳 博士 华南师范大学计算机学院.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 正文匹配模式 5.4 正文编辑 5.5 数组 5.6 数组的压缩.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
随机算法 东南大学计算机学院 方效林.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
插入排序的正确性证明 以及各种改进方法.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
入侵检测技术 大连理工大学软件学院 毕玲.
Presentation transcript:

模式匹配算法的原理及应用

引言 在计算机科学领域,串的模式匹配(算法一直都是研究焦点之一。在拼写检查、语言翻译、数据压缩、搜索引擎、网络入侵检测、计算机病毒特征码匹配以及DNA序列匹配等应用中,都需要进行串匹配。串匹配就是在主串中查找模式串的一个或所有出现。

1.朴素的模式匹配算法 朴素的模式匹配算法的核心思想是:一旦某个字符匹配失败,从头开 始(即从本次匹配起点后一个字符开始 ). 主串 (S)a b a b c a b c a c b a b 子串 (T)a b c a c (子串又被称为模式串) 红色表示当前这趟比较指针所在位置,兰色表示当前这趟比较中匹配的部分 第一趟(详细过程) a b a b c a b c a c b a b a b c a c a b a b c a b c a c b a b a b c a c a b a b c a b c a c b a b a b c a c 遇到不匹配的地方时指针回朔,每次移动一位

1.朴素的模式匹配算法 假如串的长度为m,子串的长度为n的话,那么这个算法在最坏的情况下的时间复杂度为O(m*n) , 第二趟 a b a b c a b c a c b a b a b c a c 第三趟 a b a b c a b c a c b a b a b c a c 第四趟 a b a b c a b c a c b a b a b c a c 第五趟 a b a b c a b c a c b a b a b c a c 第六趟 a b a b c a b c a c b a b a b c a c _ 完成匹配,跳出 假如串的长度为m,子串的长度为n的话,那么这个算法在最坏的情况下的时间复杂度为O(m*n) , 结论:朴素的模式匹配效率低,机械化地去重复匹配了已经比较过的内容。 问题:有没有办法降低它的时间复杂度呢? 当然有! ^_^

2.模式匹配算法的改进—KMP算法 由D.E.Knuth, J.H.Morris和V.R.Pratt同时发现的改进模式匹配算法,简称为KMP算法。 其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯主串,而是充分利用已经得到的“部分匹配”结果,过滤掉那些多余的比较,将模式串向右“滑动”尽可能远的一段距离后,继续进行比较,从而提高模式匹配的效率。 KMP算法核心之处在于:主串指针不用回溯,直接前进!不匹配时子串指针回退。 该算法的时间复杂度为O (m+n)。

2.模式匹配算法的改进—KMP算法 2.1Next的函数的引出: 分析:要想改进模式匹配的算法,必须减少无效比较,让起点自动移到当前认为的最理想的位置,而不是仅仅只移一位.但是,计算机怎么知道要移几位呢? 解决方法:设置一个next数组 那么next的函数到底是什么呢? next[j]表示当模式串中第j个字符与主串某个字符比较失败后,起点应该向后移几位. (j=next(j))

2.模式匹配算法的改进—KMP算法 2.2Next的函数的定义和计算: 求next数组本质上就是一个模式串T和自己进行匹配的过程 。

2.模式匹配算法的改进—KMP算法 void getnext (SString t, int next[]) { int j=1,k=0; while (j <= t.len) if (k==0 || t.date [j] == t.date [k]) j++; k++; next [j]=k; } else k=next [k]; // j不变(不回溯),k回溯 } 时间复杂度为O(n)

2.模式匹配算法的改进—KMP算法 2.3主程序 int kmpindex ( SString s, SString t ) { int next [ Maxlen ],i=1,j=1,v; getnext ( t,next ); while (i<= s.len && j <= t.len ) if (j==0 || s.date [i] == t.date [j]) i++; j++; } else j = next [j]; //避免多余比较,匹配串指针回退到next[j]的位置 if ( j > t.len ) v = i - t.len; // 若找到,返回主串的匹配首址 else v=-1; //若没找,返回-1 reture v; } 时间复杂度位O(m)

2.模式匹配算法的改进—KMP算法 主串S a b a b c a b c a c b a b 子串T a b c a c next(j) 0 1 1 1 2 按照KMP算法,我们再来看看前面我们举的例子。 第一趟 a b a b c a b c a c b a b a b c a c 第二趟 a b a b c a b c a c b a b a b c a c 第三趟 a b a b c a b c a c b a b a b c a c _ 完成匹配,跳出

修正next [j] 我们看下面的序列 S: aabaabbaaaaaab T: aaaab next(j) 01234 这样求出来的next串还不一定最优必须找到更优的next数组。 T串中的‘a’和S串中的‘b’失配,而‘a’的next值指的还是‘a’,那同样的比较还是会失配,而这样的比较是多余的,如果事先设定,当T[i]==T[j],那next[i]就设为next[j],在求next值的时候就已经比较了,这样就可以去掉这样的多余的比较。于是稍加改进得到: T: aaaab nextval(j) 00004

源代码:求修正的nextval[j] void getnextval(SString t, int nextval[]) { int j=1,k=0; nextval[1]=0; while (j<=t.len) if (k==0|| t.date[j]==t.date[k]) j++;k++; if (t.date[j]!=t.date[k]) nextval[j]=k; else nextval[j]=nextval[k]; //消去多余的比较 } else k=nextval[k];

KMP算法的C#源代码 # include <stdio.h> # include <string.h> //kmp algorithm //getNext -------求模式串t[ ]的next[ ]---即滑动位置数组 int * getNext( int t[ ], int nextVal[ ] ) { int i = 1,j = 0; nextVal[1] = 0; while( i < t[0] ) if ( j == 0 || t[i] == t[j] ) i++;j++; if ( t[i] != t[j] ) nextVal[i] = j; else nextVal[i] = nextVal[j]; } else j = nextVal[j]; return nextVal;

KMP算法的C#源代码 //indexKMP ------kmp主程序 int indexKMP(char s[ ], int t[ ], int next[ ], int pos ) { int i = pos; //主串指针 int j = 1; //模式串指针 while( i < strlen(s) && j <= t[0] ) //t[0]: t[ ]的长度 if ( j == 0 || s[i] == t[j] ) i++; j++; } else j = next[j]; if (j > t[0] ) return i-t[0]; else return -1; //若没找,返回-1

谢谢!