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

这篇具有很好参考价值的文章主要介绍了(C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

病毒感染检测:

医学研究者最近发现了某些新病毒,得知它们的DNA序列都是环状的。为了快速检测出患者是否感染了相应的病毒,研究者将患者的DNA和病毒的DNA均表示成一些字母组成的字符串序列,然后检测某种病毒DNA序列是否在患者的DNA序列中出现过,如果出现过,则此人感染了该病毒,否则没有感染。

例如,假设病毒的DNA序列为baa,患者1的DNA序列为aaabbba,则感染,患者2的DNA序列为babbba,则未感染。(人的DNA序列是线性的,病毒的DNA序列是环状的)

分析:

该案例实际上就是模式匹配问题,将患者的DNA序列作为主串,病毒的DNA序列作为模式串,特殊之处在于病毒的DNA序列是环状的。可用BF算法或KMP算法。

算法步骤:

(1)设置标志变量flag,用来标志是否匹配成功,初值为0表示未匹配;

(2)病毒DNA序列的长度是m,将存储病毒DNA序列的字符串长度扩大为2m,将病毒DNA序列连续存储两次,形成长度为2m的串V;

(3)对串V循环m次,重复执行以下操作:

    1. 从V中依次取得每个长度为m的病毒DNA环状字符串,作为模式串T;
    2. 调用BF算法,将模式串T和主串S(患者的DNA序列)进行模式匹配,将匹配结果返回赋值给flag;
    3. 若flag非0,表示匹配成功,中止循环表明该患者感染了病毒。

代码如下:文章来源地址https://www.toymoban.com/news/detail-718470.html

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void bd(char *T, char *S, int &len_T, int &len_S ) {	//序列处理

	printf("输入病毒串:");
	gets(T);

	printf("\n输入患者串:");
	gets(S);

	strcat(T, T);	//病毒串序列展开 例:abb变为abbabb

	len_T = strlen(T);
	len_S = strlen(S);

}

int bf(char *V, char *S, int &len_S) {	//bf算法

	int i = 0, j = 0, len_V = 3;
	while (i < len_S && j < len_V) {
		if (S[i] == V[j]) {    //判断环状病毒串和患者串字符是否匹配
			i++;
			j++;
		} else {
			i = i - j + 1;    //患者串回退至不匹配字符的下一个
			j = 0;            //环状病毒串回退至开头
		}
	}
	if (j == len_V) {    
		return 1;
	} else {
		return 0;
	}
}

void Getnext(int *next, char *S, int &len_S) {	//获取next数组
	next[0] = -1;    //next数组前两个固定赋值
	next[1] = 0;
	int i = 1;    //i为患者串下标 j为环状病毒串下标
	int j = 0;    
	while (i < len_S) {
		if ((j == 0) || (S[i] == S[j])) {
			i++;
			j++;
			next[i] = j;	//next数组存储的值为j回退的字符数组的下标
		} else {
			j = next[j];
		}
	}
}
/*例
string:	  a b a b a a b
next:    -1 0 1 1 2 3 1
sub:      0 1 2 3 4 5 6

*/

int kmp(char *V, char *S, int &len_S) {	//kmp算法
	int i = 0, j = 0, len_V = 3;
	int *next = (int *)malloc(sizeof(int) * len_S);	//申请空间
	Getnext(next, S, len_S);
	while (i < len_S && j < len_V) {
		if ((j == -1) || (V[j] == S[i])) {
			j++;
			i++;
		} else {
			j = next[j];    //区别bf算法 回退位置不同 其他相同
		}
	}
	free(next);	//结束释放内存
	if (j == len_V) {
		return 1;
	} else {
		return 0;
	}
}

void xh(int len_S, int len_T, char *T, char *S) {	//检测函数

	int flag;
	len_T /= 2;
	while (len_T ) {

		char V[3];    //环状病毒串

		strncpy(V, T, 3);    //例:abb有三个环状病毒串abb、bba、bab

		//二选一 bf&kmp
//		flag = bf(V, S, len_S);		//使用bf算法
		flag = kmp(V, S, len_S);	//使用kmp算法

		if (flag) {		//判断
			printf("感染\n");
			return ;
		}

		T++ ;
		len_T--;
	}
	printf("未感染\n");
}

int main(void) {
	char T[30], S[30];    //病毒串T 患者串S
	int len_T, len_S;    //串长度
	bd(T, S, len_T, len_S);
	xh(len_S, len_T, T, S);
}

到了这里,关于(C语言)数据结构算法-病毒感染检测(BF算法&&KMP算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法复现 - 病毒感染检测(案例4.1算法4.5)

    第1关:案例4_1 病毒感染检测

    2024年02月06日
    浏览(38)
  • 勒索病毒最新变种.faust勒索病毒来袭,如何恢复受感染的数据?

    引言: 随着我们进入数字化时代,数据的重要性变得愈发显著,而网络安全威胁也日益增加。.faust勒索病毒是其中一种备受恶意分子钟爱的危险工具,它通过加密用户文件并勒索高额赎金来对个人和组织发起攻击。本文将深入探讨.faust勒索病毒的威胁,包括其工作原理、如何

    2024年02月21日
    浏览(46)
  • 勒索病毒最新变种.halo勒索病毒来袭,如何恢复受感染的数据?

    摘要: .halo勒索病毒已成为数字世界中的威胁,通过高级加密技术将文件锁定,并要求支付赎金。本文91数据恢复将深入介绍.halo勒索病毒的工作原理,提供解锁被感染文件的方法,以及探讨如何有效预防这一威胁。如果您正在经历勒索病毒数据恢复的困境,我们愿意与您分享

    2024年02月09日
    浏览(41)
  • 数据结构——排序算法(C语言)

    本篇将详细讲一下以下排序算法: 直接插入排序 希尔排序 选择排序 快速排序 归并排序 计数排序 排序的概念 排序:所谓排序,就是使一串记录,按照其中的某个或某写的大小,按照递增或递减0排列起来的操作。 稳定性的概念 假定在待排序的记录序列中,存在多个

    2024年02月08日
    浏览(65)
  • C语言数据结构与算法

    冒泡排序 例题 顺序表下的 冒泡排序 注意:冒泡排序 稳定,最多执行n(n-1)/2次 选择排序不稳定,平均比较次数n(n-1)/2 直接插入排序,是在有序基础上,速度最快且稳定的排序方法。 希尔排序是 不稳定的 顺序查找 二分查找(非递归) 二分查找(递归) 数组 链表 查询 快 慢

    2024年02月06日
    浏览(74)
  • 数据结构和算法——用C语言实现所有图状结构及相关算法

    本文所有代码均在仓库中,这是一个完整的由纯C语言实现的可以存储任意类型元素的数据结构的工程项目。 首先是极好的工程意识,该项目是一个中大型的CMake项目,结构目录清晰,通过这个项目可以遇见许多工程问题并且可以培养自己的工程意识。 其次是优秀的封装性(

    2024年02月06日
    浏览(222)
  • Mallox勒索病毒最新变种.malox勒索病毒来袭,如何恢复受感染的数据?

    Mallox勒索病毒是一种针对计算机系统的恶意软件,能够加密受感染计算机上的文件。最近,新的Mallox病毒变种.malox勒索病毒被发现并引起了关注,.malox勒索病毒这个后缀已经是Mallox勒索病毒家族的第十几个升级变种了,这个后缀的加密占比更高,导致数据的修复难度再次升级

    2024年02月06日
    浏览(44)
  • 数据结构与算法——排序(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年04月09日
    浏览(59)
  • C语言 数据结构--栈 括号匹配算法

    今天这一期使用栈来完成括号匹配算法 ① 栈结构 ② 初始化栈 ③ 入栈 ④ 出栈 ⑤ 判断栈是否为空 ⑤ 括号匹配 完整代码: 结果: (1)括号序列为char str[]={\\\'(\\\',\\\'{\\\',\\\'[\\\',\\\']\\\',\\\'}\\\',\\\')\\\'}; (2)括号序列为char str1[]={\\\'{\\\',\\\'(\\\',\\\'}\\\',\\\']\\\'};    

    2024年02月05日
    浏览(54)
  • C语言 数据结构与算法 I

    因为之前写算法都是用C++,也有了些C++基础,变量常量数据类型就跳过去吧。 首先是环境,学C++时候用Clion,C语言也用它写吧~ 新建项目,选C执行文件,语言标准。。。就先默认C99吧,反正是测试环境,应该问题不大 直接运行一手 嗯。。JB家的新UI。。真是。。。。。。。一

    2024年02月09日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包