NO.1 BF(Brute Froce),MP
来源:互联网 发布:张靓颖 冯轲 知乎 编辑:程序博客网 时间:2024/06/05 06:12
***BF(Brute Froce)***
看着是不是有点蒙,不知道这是啥?!
简单一点吧,我都不知道,原来这也是个算法……
释:
挨个字符比较。
就是我们没学算法前,都会用的一种,只是名字比较高端了而已。
例:
A:121232
B:232
从A的第一个字符与B的字符进行比较,1—2不符合,然后A的第二个字符与B的字符比较(从B的第一个字符开始),2—-2,1—–3,不符合,然后A的第三个字符B的字符比较(从B的第一个字符开始),1—2,不符合,然后A的第四个字符B的字符比较(从B的第一个字符开始),2–2, 3—3, 2—-2,比较成功,完成!
***MP***
我知道,看到了MP,大家以为我打错了,不是KMP吗?
其实,MP也是一种算法,而且,正如大家所想象的一样,它与KMP算法有着密切的联系。
释:
MP算法避免了BF中频繁的回溯,又称为不回溯的字符串搜索算法。算法复杂度O(M+N)。
MP中,遇到了不匹配的字符,指针不必回溯,而是利用已得到的部分匹配结果,将模式向右滑动若干后,继续比较。//现在不理解不要紧,继续看下面,会理解的。
例:
T(目标串):ctcaatcacaatcat
P(模式串):caatcat
从T的第一个字符与P的字符进行比较,c——c, t—–a,不符合,然后,字符串P向后移动一位; 然后,t—c,不符合;再向后移动一位……
细心的同学可能会发现,当进行第二轮以后的匹配时,可以先进行P串自身的匹配。
所以,这就用到了失效函数,下面举个例子,怎样获取实现函数:
P的失效函数:
定义域:0~Len(P)-1(//Len(P)字符串的长度);
值域:k 属于{x|0<=x小于j }
若k不存在,失效函数的取值为-1.
当j=0, k可能的取值不存在,f(0) = -1;
当j=1, k可能的取值0,p0!=p1, f(1) = -1;
当j=2, k可能的取值0, 1,p0!=p2, p0p1!=p1p2,f(2) = -1;
……
失效函数示例:
- j 0, 1 , 2 , 3, 4, 5, 6
- P(j) c, a , a, t, c, a, t
- f(j) -1, -1, -1, -1, 0, 1, -1
得到失效函数之后,就可以运用MP算法进行匹配。
1. c—-c, t—–a,不符合,目标指针不回溯,失配发生在第二个位置,所以,j=1,模式P在下一轮的起始地址是Pf(j-1)+1,即P0。
2. t—-c,不符合,j=0, 目标指针前进一位。
3. c—–c, a—–a, a—-a, t—-t, c——c, a——a, c——t, 不符合,j=6, Pf(6-1)+1, 即P2。
4. ……
一直到匹配成功。
MP算法的时间复杂度为O(n+m).
#include <iostream>using namespace std;void preMp(const char *x, int m, int mpNext[]){ int i, j; i = 0; j = mpNext[0] = -1; while(i<m) { while(j>-1&&x[i]!=x[j]) j = mpNext[j]; mpNext[++i] = ++j; }}void MP(string p, string t){ int m = p.length(); int n = p.length(); if(m>n) { cerr<<"Unsuccessful match!"<<endl; return ; } const char * x = p.c_str(); const char * y = t.c_str(); int i = 0, j = 0, mpNext[m+1]; preMp(x, m, mpNext); while(j<n) { while(i>-1 && x[i] != y[j]) { i = mpNext[i]; i++; j++; if(i>=m) { cout<<"Matching index found at: "<<j-1<<endl; i = mpNext[i]; } } }}
推荐一篇写的十分的好的博客
- NO.1 BF(Brute Froce),MP
- BF 算法(Brute Force)
- BF(Brute-Force)算法
- BF算法(Brute Force)
- BF(Brute Force)算法
- 串的模式匹配算法1——Brute-Force(BF)算法
- [Ruby] Ruby BF 算法 Brute Force
- 从思维方式看BF,MP,KMP
- 串的模式匹配之 Brute—Force(BF)
- 字符串模式匹配 BF(Brute Force)算法
- 模式匹配之BF(Brute Force)暴力算法
- 文本的精确匹配(BF,MP,KMP)
- 我们先来看BF算法(Brute-Force,最基本的字符串匹配算法)
- 查找---BF算法(1)
- MP 新版本[1 express框架 ]
- TCO14 1B L2: WolvesAndSheep, brute force
- python数据结构与算法1: BF算法
- Java实例1 - 朴素字符匹配 Brute Force
- 无题
- 快速了解Jmeter
- PAT 甲级 1013. Battle Over Cities
- mybatis的二级缓存
- 提取docx转为txt后的文件内容
- NO.1 BF(Brute Froce),MP
- 高效率科研神器——小软件、大能量
- 最详细的Log4j使用教程
- 什么是线程安全
- 剑指offer C++
- java环境配置
- Socket套接字是什么?
- 每周荐书:MyBatis、并行编程、Ansible(评论送书)
- Android平台下JNI调用第三方so库