KMP算法的摘抄
来源:互联网 发布:inode linux 64 下载 编辑:程序博客网 时间:2024/06/11 18:38
KMP字符串模式匹配详解
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。
一.简单匹配算法
先来看一个简单匹配算法的函数:
int Index_BF ( char S [ ], char T [ ], int pos )
{
/* 若串 S 中从第pos(S 的下标0≤pos<StrLength(S))个字符
起存在和串 T 相同的子串,则称匹配成功,返回第一个
这样的子串在串 S 中的下标,否则返回 -1 */
int i = pos, j = 0;
while ( S[i+j] != '/0'&& T[j] != '/0')
if ( S[i+j] == T[j] )
j ++; // 继续比较后一字符
else
{
i ++; j = 0; // 重新开始新的一轮匹配
}
if ( T[j] == '/0')
return i; // 匹配成功 返回下标
else
return -1; // 串S中(第pos个字符起)不存在和串T相同的子串
} // Index_BF
此算法的思想是直截了当的:将主串S中某个位置i起始的子串和模式串T相比较。即从 j=0 起比较 S[i+j] 与 T[j],若相等,则在主串 S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即将串T向后滑动一位,即 i 增1,而 j 退回至0,重新开始新一轮的匹配。
此算法的思想是直截了当的:将主串S中某个位置i起始的子串和模式串T相比较。即从 j=0 起比较 S[i+j] 与 T[j],若相等,则在主串 S 中存在以 i 为起始位置匹配成功的可能性,继续往后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,否则改从S串的下一个字符起重新开始进行下一轮的"匹配",即将串T向后滑动一位,即 i 增1,而 j 退回至0,重新开始新一轮的匹配。
例如:在串S=”abcabcabdabba”中查找T=” abcabd”(我们可以假设从下标0开始):先是比较S[0]和T[0]是否相等,然后比较S[1] 和T[1]是否相等…我们发现一直比较到S[5] 和T[5]才不等。如图:
当这样一个失配发生时,T下标必须回溯到开始,S下标回溯的长度与T相同,然后S下标增1,然后再次比较。如图:
这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。如图:
这次立刻发生了失配,T下标又回溯到开始,S下标增1,然后再次比较。如图:
又一次发生了失配,所以T下标又回溯到开始,S下标增1,然后再次比较。这次T中的所有字符都和S中相应的字符匹配了。函数返回T在S中的起始下标3。如图:
二. KMP匹配算法
还是相同的例子,在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算法,当第一次搜索到S[5] 和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值(next[5]=2,为什么?后面讲),直接比较S[5] 和T[2]是否相等,因为相等,S和T的下标同时增加;因为又相等,S和T的下标又同时增加。。。最终在S中找到了T。如图:
KMP匹配算法和简单匹配算法效率比较,一个极端的例子是:
在S=“AAAAAA…AAB“(100个A)中查找T=”AAAAAAAAAB”, 简单匹配算法每次都是比较到T的结尾,发现字符不同,然后T的下标回溯到开始,S的下标也要回溯相同长度后增1,继续比较。如果使用KMP匹配算法,就不必回溯.
对于一般文稿中串的匹配,简单匹配算法的时间复杂度可降为O (m+n),因此在多数的实际应用场合下被应用。
KMP算法的核心思想是利用已经得到的部分匹配信息来进行后面的匹配过程。看前面的例子。为什么T[5]==’d’的模式函数值等于2(next[5]=2),其实这个2表示T[5]==’d’的前面有2个字符和开始的两个字符相同,且T[5]==’d’不等于开始的两个字符之后的第三个字符(T[2]=’c’).如图:
也就是说,如果开始的两个字符之后的第三个字符也为’d’,那么,尽管T[5]==’d’的前面有2个字符和开始的两个字符相同,T[5]==’d’的模式函数值也不为2,而是为0。
前面我说:在S=”abcabcabdabba”中查找T=”abcabd”,如果使用KMP匹配算法,当第一次搜索到S[5] 和T[5]不等后,S下标不是回溯到1,T下标也不是回溯到开始,而是根据T中T[5]==’d’的模式函数值,直接比较S[5] 和T[2]是否相等。。。为什么可以这样?
刚才我又说:“(next[5]=2),其实这个2表示T[5]==’d’的前面有2个字符和开始的两个字符相�
- KMP算法的摘抄
- 匹配算法(网络摘抄)-KMP
- KMP算法(2)-KMP算法的基础
- 各类排序算法的比较[摘抄]
- KMP算法的实现
- KMP算法的学习心得
- KMP算法的学习心得
- 扩展的KMP算法,
- KMP算法的思想
- KMP算法的实现
- KMP算法的理解
- KMP算法的实现
- KMP算法的实现
- kmp算法的应用
- KMP算法的理解
- KMP算法的实现
- KMP算法的详解
- 字符串的KMP算法
- java 中的大数据类型(BigInteger和BigDecimal)
- 笔试面试之最大对称字串
- 在fedora打开文件夹如何不另起一个窗口
- SQL SERVER 2005 同步复制技术
- CSS学习(1)选择符selector
- KMP算法的摘抄
- 新兴的“视线媒体”将冲击网页蹩脚闪客作品大流行的局面
- 关于小红伞免费V9简体中文版、v10 出现“SSL"提示不能安装的解决方法
- SQL 系统存储过程用法整理
- 常用颜色大全
- 一系列移动开发的课程(MS)
- 2010年8月14日安排~
- C#编写最小化到系统托盘的Windows应用程序
- VPN技术白皮书
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
汽车灯罩发黄怎么办
着火怎么办幼儿教案
液化气着火怎么办
着火怎么办幼儿
幼儿园着火怎么办教案
电着火怎么办图片
着火了怎么办社会
电线着火了怎么办
眼睛干涩模糊怎么办
老年人眼睛干涩怎么办
中老年眼睛干涩怎么办
头昏眼睛胀怎么办
眼睛红肿疼痛怎么办
眼睛疼怎么办
眼睛总是流眼泪怎么办
眼睛经常流泪怎么办
眼睛酸怎么办
消防栓响了怎么办
耳莫漏气怎么办
信息泄漏了怎么办
电脑内存泄漏怎么办
木糠杯没有炼乳怎么办
狗狗吃了奥利奥怎么办
泰迪吃了奥利奥怎么办
onedrive打不开怎么办
魔兽7.0卡蓝条怎么办
探探换不了头像 怎么办
吸收能力差怎么办
dnf缺钱怎么办
饥荒中毒了怎么办
金丝竹手串黑了怎么办
杜鹃花叶子干枯怎么办
龙须铁叶子干枯怎么办
ini文件乱码怎么办
电脑经常假死怎么办
电脑假死机怎么办
笔记本假死了怎么办
网页错误503怎么办
对话语敏感怎么办
手机错误500怎么办
文件夹拒绝访问怎么办