- 4
- 0
- 约2.38万字
- 约 31页
- 2017-01-13 发布于天津
- 举报
KMP算法思想-省句中
KMP字符串模式匹配详解
来自CSDN A_B_C_ABC网友
KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。
一. 简单匹配算法
先来看一个简单匹配算法的函数:
int Index_BF ( char S [ ], char T [ ], int pos )
{
/*若串 S中从第pos(S的下标0≤posStrLength(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=”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个字符和开始的两个字符相同”。请看图 :因为,S[4] ==T[4],S[3] ==T[3],根据next[5]=2,有T[3]==T[0],T[4] ==T[1],所以S[3]==T[0],S[4] ==T[1](两对相当于间接比较过了),
您可能关注的文档
- CP-003排課作業程序-課務組-開南大學.doc
- EndNote_使用初階_(梁恆正館長).ppt-中國文化大學圖書館.ppt
- GENEWIZ-人才引进(9.19).ppt-食品科学学院.ppt
- Arduino、S4A與藍牙遙控車.ppt
- III.已發行股本變動詳情-SauSanTong修身堂.doc
- IEL全文数据库.ppt.ppt
- II匯報啟動課程的整體表現.doc
- IPOfirmsbythebivariatesignalingmodel.doc.doc
- IPBES45联合国BESIPBES45生物多样性和生态系统服务政府间.doc
- ITEMSREQUIREDFORHEALTHCERTIFICATE(TypeB).doc
最近下载
- 英雄起源一本通大陆系列是由吧在友qxqy19群雄基础.pdf VIP
- 湘2021G301预制带肋底板混凝土叠合楼板(混凝土肋、钢筋肋、钢管肋)(版本2).docx VIP
- SL352-2020 水工混凝土试验规程.docx VIP
- 2025年中国医疗人工智能行业投资潜力分析及行业发展趋势报告.docx
- SL677-2014 水工混凝土施工规范.docx VIP
- 2024-2034年中国医疗人工智能行业投资潜力分析及行业发展趋势报告.docx
- 湘2021G301预制带肋底板混凝土叠合楼板(混凝土肋、钢筋肋、钢管肋)(版本2).docx VIP
- 电摩知识培训课件图片.ppt VIP
- 平顶山工业职业技术学院《高等数学(D)》2025 - 2026学年第一学期期末试卷.docx VIP
- 110kV变电站专项电气试验及调试方案.doc VIP
原创力文档

文档评论(0)