从病毒感染检测谈串的模式匹配

本文探讨病毒感染检测中的串模式匹配问题,详细解析了BF算法和KMP算法的实现过程。针对BF算法中遇到的超时问题,通过改用KMP算法解决了效率问题。同时,解释了KMP算法的核心思想,包括何时可以跳过无用比较,并介绍了如何通过next数组实现模式匹配。最后,给出了病毒感染检测的实际应用案例。
摘要由CSDN通过智能技术生成

病毒感染检测:串的模式匹配 BF、KMP算法

在网络入侵检测、计算机病毒特征码匹配以及DNA序列匹配等应用中都需要进行串的模式匹配。针对这个问题,书上讲了两种模式匹配的算法,即BF算法和KMP算法,下面针对这两种算法的实现谈谈我的思路。

1、代码部分

BF算法

#include<iostream>
using namespace std;
#include<string.h>

//采用静态顺序存储结构(定长) 
typedef struct{
   
	char ch[1000001];	//存储串的一维数组 
	int length;		//串的长度 
}SString;
 
 SString S,T; 
 
 char s[1000001];
 char t[1000001];
 
//BF算法
//查找 模式T 在 主串S 中第pos个字符开始第一次出现的位置,并返回 
//若不存在,则返回0 (T非空,1<=pos<=S.length) 
int Index_BF(SString S,SString T,int pos)  
{
   				
	int i,j;
	i=pos;
	j=0;
	while(i<=S.length-1 && j<=T.length-1)
	{
   
		if(S.ch[i]==T.ch[j]){
   	//从各自的第一位开始比较,如果相同,比较下一位 
			++i;
			++j;
		}
		else {
   //如果不同,主串指针回到 上次开始比较时的字符 的下一个字符,
			  //模式回到第一个字符,重新开始比较 
			i=i-j+1;
			j=0;
		} 
	}
	if(j>T.length-1)		//匹配成功 
		return i-T.length+1;//主串指针位置往回退模式长度个单位,就回到了该模式在主串中第一次出现的位置 
	else			//匹配失败 
		return 0;	//返回0(顺序存储的字符串是从下标为1的数组分量开始存储的,下标为0的分量闲置不用) 
} 
 
//主函数 
int main()
{
   
	cin>>s>>t;
	strcpy(S.ch,s);
	strcpy(T.ch,t);
	S.length=strlen(S.ch);
	T.length=strlen(T.ch);
    cout<<Index_BF(S,T,0)<<endl;;
	return 0;
}

KMP算法

#include<iostream>
using namespace std;
#include<string.h>

//采用静态顺序存储结构(定长) 
typedef struct{
   
	char ch[1000002];	//存储串的一维数组 
	int length;		//串的长度 
}SString;
 
 SString S,T; 
 
 char s[1000002];
 char t[1000002];
 int nex[1000002];
 
//KMP算法
//查找 模式T 在 主串S 中第pos个字符开始第一次出现的位置,并返回 
//若不存在,则返回0 (T非空,1<=pos<=S.length) 
int Index_KMP(SString S,SString T,int next[])  
{
   				
	int i,j;
	i=j=0;
	while(i<=S.length-1 && j<=T.length-1)
	{
   
		if(j==-1||S.ch[i]==T.ch[j]){
   	//从各自的第一位开始比较,如果相同,比较下一位 
			++i;
			++j;
		}
		else {
   
			j=next[j];
		} 
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值