从BF算法到kmp算法详解

摘要:
子字符串与父字符串1匹配。BF算法3的解决方案。kmp算法的实现(1)当已经有BF算法时,为什么会有kmp算法?(2) 本发明算法的基本思想(3)具体实现I KMP介绍了KMP算法是一种改进的字符串匹配算法(由BF算法改进,这是一种有利可图的搜索和匹配方式,可以很好地处理子字符串和父字符串的匹配。示例:子字符串匹配父字符串:ababc要求子字符串与父字符串匹配,并找出匹配的位置。步骤1:匹配父字符串:

正文索引
一、KMP介绍
二、例子:子串匹配母串
1.BF算法的解决方法
三、kmp算法的实现
(1)为什么已经有BF算法了还要有KMP算法呢?
(2)发明的算法基本思想
(3)具体实现


一、KMP介绍

KMP算法是一种改进的字符串匹配算法(有BF算法改进而来,BF算法是暴利搜索匹配的方式,而KMP则是对BF算法的回溯过程进行改进,从而大幅度降低了时间复杂度),能够很好地处理子串与母串的匹配

二、例子:子串匹配母串
母串:a b a a c a b a b c a c
子串:a b a b c

要求子串与母串进行匹配,求解在哪一个位置匹配上了。

1.BF算法的解决方法

关键词:逐一匹配 暴力搜索

第一步匹配

母串:a b a a c a b a b c a c
子串:a b a b c
匹配结果:第四个位置匹配失败

第二步匹配

母串:a b a a c a b a b c a c
子串: a b a b c
匹配结果:第一个匹配位置失败

第三步匹配

母串:a b a a c a b a b c a c
子串: a b a b c
匹配结果:第二个位置匹配失败

第四个位置

母串:a b a a c a b a b c a c
子串: a b a b c
匹配结果:第二个位置匹配失败

第五个位置

母串:a b a a c a b a b c a c
子串: a b a b c
匹配结果:第一个位置匹配失败

第六个位置

母串:a b a a c a b a b c a c
子串: a b a b c
匹配结果:匹配成功,返回位置6

以上就是BF算法的匹配过程,逐一移动,每个位置都尝试一遍
(算法图解,注意回溯位置)

i 回溯到开始位置+1

j 回溯到子串的0位置

推理过程:j的长度实际上等于i向左移动的位置,那么要返回开始的位置再加1就可以表示成 i - j + 1

int BFstring(string MotherStr, string SonStr){
    int i = 0, j = 0;
    for(;(i != MotherStr.size()) && (j != SonStr.size());){
        if(MotherStr[i] == SonStr[j]){
            i++, j++;
        }
        else{
            i = i - j + 1;
            j = 0;
        }
        if(j == SonStr.size()){
            return i - j + 1;
        }

    }
    return 0;
}

int BFchar(char MotherStr[],char SonStr[]){
    int i, j;
	i = 0;//主串指针
	j = 0;//子串指针
	while (MotherStr[i] != '

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇你不知道的 Blob07-node.textContent 与innerText比着,不会触发回流下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

GJK碰撞检测算法

https://blog.lufei.so/#/collisionDetection/GJK/1 https://blog.lufei.so/#/collisionDetection/GJK/2 现实世界里我们对于是否碰撞的判断可以说极其容易而且准确,比如下图。在二进制的世界里,一切就没这么直观了。 GJK(Gilbert-Johnson-Keerthi...

国家集训队论文分类整理(转)

距离ACM/ICPC的时间越来越少了,选择性地看一些集训队论文是很有必要的。 (在此给已经看过所有论文的神牛跪了= =)http://www.cnblogs.com/AbandonZHANG/archive/2012/07/21/2601889.html 所以,我在此整理了一下,供大家参考。 组合数学 计数与统计 2001 - 符文杰:《P...

【推荐系统实战】:C++实现基于用户的协同过滤(UserCollaborativeFilter)

好早的时候就打算写这篇文章,可是还是參加阿里大数据竞赛的第一季三月份的时候实验就完毕了。硬生生是拖到了十一假期。自己也是醉了。。。 找工作不是非常顺利,希望写点东西回想一下知识。然后再攒点人品吧,仅仅能如此了。 一、问题背景 二、基于用户的协同过滤算法介绍 三、数据结构和实验过程设计 四、代码 一、问题背景 首先介绍一下问题的背景。如今我有四个月的用户...

【Guava】使用Guava的RateLimiter做限流

一、常见的限流算法 目前常用的限流算法有两个:漏桶算法和令牌桶算法。 1.漏桶算法 漏桶算法的原理比较简单,请求进入到漏桶中,漏桶以一定的速率漏水。当请求过多时,水直接溢出。可以看出,漏桶算法可以强制限制数据的传输速度。 2.令牌桶算法 令牌桶算法的原理是系统以一定速率向桶中放入令牌,如果有请求时,请求会从桶中取出令牌,如果能取到令牌,则可以继续完成请求...

[转]C# 获取硬盘序列号 Volume Serial Number

在做软件注册时,通常用硬盘号(建议用散列后的硬盘号)作为本地电脑特征码,加上用户名以及公司名等其他信息,通过一定的算法,得到软件序列号。这样做的好处的显而易见的。它可以防止一个序列号N多人用的现象。现在有些软件就是一个注册码,在网上公开,全世界人都在用。但是也有相应的缺陷。客户只能在一台电脑上用你写的软件。下面的方法通过Windows API获得硬盘号。...

Cocos2d-x中Vector使用

1、创建Vector对象 Vector()。默认的构造函数。 Vector(ssize_t capacity)。创建Vector对象,并设置容量。 Vector(const Vector<T> &other) 。用一个已存在的Vector对象创建另一个Vector对象,其中&other是左值引用参数传递。 Vector(Vec...