什么是KMP算法?

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
(通俗的说就是:用来找目的串中是否包含模式串的。。。。)

那么为什么会有KMP算法呢?!还不是因为三位dalao认为BF算法太慢太暴力了。。。。。。。。
这里我也只给出KMP算法的代码,不深究和不解释了,毕竟能用就好。。。。

KMP

int KMP(char *sh, char *ch, int pos, int *next)//sh为目的串,ch为模式串
{int les = strlen(sh);int lec = strlen(ch);int i=pos, j=0;     //从pos处开始匹配,while(i<les && j<lec){if(j == -1 || sh[i] == ch[j]){++i;++j;}elsej = next[j];}if(j >= lec)       //匹配成功返回下标 ,否则返回-1return i-lec;elsereturn -1;
}

这就是KMP算法,详细解释我也不写了,毕竟太多了。。。

next [ j ]数组的求法。。。。(只与模式串有关)

这里呢,,,我们也就和网上多数next [ j ] 的求法一样,初始为-1,0代表有一个前后缀相同,1 代表有两个,,,以此类推。

(1)next[0]= -1 意义:任何串的第一个字符的模式值规定为-1。
(2)next[j]= -1 意义:模式串T中下标为j的字符,如果与首字符相同,且j的前面的1—k个字符与开头的1—k个字符不等
(或者 相等但T[k]==T[j])(1≤k<j),如:T=”abCabCad” 则 next[6]=-1,因T[3]=T[6].
(3)next[j]=k 意义:模式串T中下标为j的字符,如果j的前面k个字符与开头的k个字符相等,且T[j] != T[k] (1≤k<j)即T[0] T[1] T[2]…T[k-1] == T[j-k] T[j-k+1] T[j-k+2]…T[j-1] 且 T[j] != T[k].(1≤k<j);
(4) next[j]=0 意义:除(1)(2)(3)的其他情况。

先给出普通的next数组的求法:

void NEXT(char *ch, int *next)
{int lec = strlen(ch);int i=0, j=-1;next[0] = -1;       //初始化为-1;while(i < lec){if(j == -1 || ch[i] == ch[j])next[++i] = ++j;elsej = next[j];}
}

下面我也就直接给出优化版后的next [ j ] 算法:

void NEXT(char *ch, int *next)
{int lec = strlen(ch);int i=0, j=-1;next[0] = -1;       //初始化为-1;while(i < lec){if(j == -1 || ch[i] == ch[j]){if(ch[++i] == ch[++j]) //优化。。。next[i] = next[j];elsenext[i] = j;}elsej = next[j];}
}

好了, 下面给出病毒检测的完整代码:

题意:给出检测样例T,表示有T组样例,然后给出病毒的DNA序列(难道没有RNA病毒嘛?!),再给出人的DNA序列,但是,众所周知,大部分的病毒DNA都是环状的,,,,所以,你要敲个代码用来检测该人体的DNA中是否含有病毒的DNA序列,,

思路:好吧,很明显是字符串匹配吧,,,,但是这里要注意病毒的DNA是环状的就可以了。。。。。(我们用BF暴力吧?!不可以,不可能,大牛们这么可以忍受在数十亿的基因序列上这么暴力,,所以,我用了KMP。。。。)

//#include<bits/stdc++.h>
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#include<string>
#include<math.h>
using namespace std ;
typedef long long ll;
#define MAXN 1005
#define INF 0x3f3f3f3ftypedef struct Chunk
{char goal[MAXN];    //存放单链DNAchar type[MAXN*2];  //存放病毒char mo[MAXN];      //模式串存放更新int next[MAXN];     //KMP中模式串的next[j];int leg;            //单链DNA的长度;int let;            //病毒基因的长度int flag;           //判断是否匹配成功
} SString;int KMP(SString &T)     //KMP算法
{int i=0, j=0;while(i<T.leg && j<T.let){if(j == -1 || T.goal[i] == T.mo[j]){++i;++j;}elsej = T.next[j];}if(j > T.let-1)return i-T.let;elsereturn -1;
}void NNext(SString &T)  //next[j];
{memset(T.next, 0, sizeof(T.next));int i=0, j=-1;T.next[0] = -1;while(i<T.let){if(j == -1 || T.mo[i] == T.mo[j]){if(T.mo[++i] == T.mo[++j])T.next[i] = T.next[j];elseT.next[i] = j;}elsej = T.next[j];}
}void init(SString &T) //输入
{T.flag = -1;scanf("%s%s", T.type, T.goal);T.leg = strlen(T.goal);T.let = strlen(T.type);int i, j;for(i=T.let, j=0; j<T.let; ++j)T.type[i++] = T.type[j];
}void print(SString T)   //输出
{for(int i=0; i<T.let; ++i)cout << T.type[i];cout << ' ' << T.goal << ' ';if(T.flag != -1)cout << "Yes" << '\n';elsecout << "No" << '\n';
}int main()
{int n;cin >> n;SString ss[n];for(int i=0; i<n; ++i)init(ss[i]);for(int i=0; i<n; ++i){for(int j=0; j<ss[i].let; ++j){for(int k=0; k<ss[i].let; ++k)      //模式串更新ss[i].mo[k] = ss[i].type[k+j];ss[i].mo[ss[i].let] = '\0';         //防止访问越界NNext(ss[i]);                       //更新next[j];ss[i].flag = KMP(ss[i]);            //KMP查询if(ss[i].flag != -1)break;}}for(int i=0; i<n; ++i)print(ss[i]);return 0;
}

KMP算法之病毒检测相关推荐

  1. KMP算法解决病毒检测问题

    一.串的匹配方法简单介绍 我们都知道在串的匹配算法有暴力算法和KMP算法,KMP相对于效率好些(当然代码不好理解). 二.问题引入 如果仅仅是拿病毒的DNA样本和待检测的DNA样本进行匹配的话,那我们 ...

  2. C语言KMP算法之病毒检测

    完整代码: 注意:这里所有数组有效信息都是从第二个数据开始. #include<stdio.h> #include<string.h> #define N 100 void g ...

  3. 基于kmp字符串模式配算法的病毒感染检测问题

    本文记录了数据结构习题解析与实验指导(李冬梅)的实验4. 以下是实验内容 文章目录 1 问题描述 2 基本思想 3 KMP算法 4 Kmp代码主体部分 5 全部代码 6 nextval数组 1 问题描 ...

  4. (C语言)数据结构算法-病毒感染检测(BF算法KMP算法)

    病毒感染检测: 医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的.为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种 ...

  5. 基于字符串模式匹配算法的病毒感染检测问题(KMP算法)

    头文件(tou.h): void get_next(char T[], int next[]);int Index_KMP(char S[], char T[]);void move1(char a[ ...

  6. 病毒检测(BF实现)

    题目: 给出几组人的DNA序列(如abcabcd),以及几组病毒的DNA序列(bca),已知其中病毒DNA都是环状的.检测该人体的DNA中是否含有病毒的DNA序列. 思路: 该问题为典型的字符串匹配问 ...

  7. KMP算法的理解,伪代码,c代码实现

    2019独角兽企业重金招聘Python工程师标准>>> 1.字符串问题形式化定义:假设文本是一个长度为n的T[1..n],而模式是一个长度为m的数组P[1..m],其中m<=n ...

  8. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  9. 数据结构——模式匹配kmp算法

    暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int i=pos,j=1;while(i<=S[0]&&j<=T[ ...

最新文章

  1. 【工具类】页面静态化 --- Freemarker的使用
  2. 图解linux下top命令的使用
  3. YBTOJ洛谷P2042:维护数列(平衡树)
  4. python gil锁存在的意义_关于python的GIL全局解释器锁的简单理解
  5. 程序的图标无法改变_想体验程序猿日常工作的快乐吗?来玩国产烧脑益智游戏《异常》...
  6. 密码货币量化基金突然很热,但你可知道成功有多难?
  7. Python库全家福,基本都齐了
  8. matlab求dfa指数,关于使用MF-DFA方法计算广义Hurst指数的MATLAB操作问题
  9. Unity Spine图层混合叠加效果不生效
  10. 华为AR路由器端口配置trunk_锐捷交换机和路由器的一些基础命令
  11. 小黑为四川大学实习金融专业同学解决了困扰好久的一个代码小bug,获得成就感,和清华实习同学约饭啦(被请客),继续向前的leetcode之旅:145. 二叉树的后序遍历
  12. [007]爬虫系列 | 猿人学爬虫攻防大赛 | 第二题: js 混淆 - 动态Cookie
  13. 矫形鞋的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  14. 阿里达摩院-XR实验室2022春招校招内推
  15. 《现实世界的敏捷开发-大型敏捷研发团队》培训课程扩展阅读
  16. 数学图形(1.16) 笛卡儿叶形线
  17. 管理后台项目-04-SPU列表-增删改SPU-获取SKU【续】
  18. 修改Gitblit账号密码步骤
  19. 论文投稿指南——中文核心期刊推荐(经济管理)
  20. 驱动开发:内核特征码扫描PE代码段

热门文章

  1. python中文文本分词_SnowNLP:?中文分词?词性标准?提取文本摘要,?提取文本关键词,?转换成拼音?繁体转简体的 处理中文文本的Python3 类库...
  2. sx html5编辑器,SX HTML5全栈可视编辑器
  3. 阿里2020.4.1实习笔试题——攻击怪兽
  4. 苹果6s出现连接不上服务器未响应,苹果6s的蜂窝移动数据打开没反应怎么办
  5. Codeforces Round #405 B. Bear and Friendship Condition a-b,b-c a-c??
  6. 西澳大学诚招计算机视觉/机器学习方向博士研究生
  7. Java基础知识(语言基础)
  8. 为什么手机一开机,就有Powered by Android
  9. 《自然语言处理》的相关资源
  10. Educational Codeforces Round 96 (Rated for Div. 2) ABCD