BF算法的实现:病毒感染检测

一、问题引入

BF(Brute-Force)算法介绍了BF算法的具体实现,但并未结合具体案例。

本随笔就是结合案例(病毒感染检测)对BF算法进行结合分析。

案例4.1: 病毒感染检测

医学研究者最近发现了某些新病毒, 通过对这些病毒的分析, 得知它们的 DNA 序列都是环状的。现在研究者巳收集了大量的病毒DNA 和人的DNA 数据,想快速检测出这些人是否感染了相应的病毒。为了方便研究,研究者将人的DNA 和病毒DNA 均表示成由一些字母组成的字符串序列,然后检测某种病毒DNA 序列是否在患者的DNA 序列中出现过,如果出现过,则此人感染了该病毒, 否则没有感染。例如, 假设病毒的DNA 序列为baa, 患者1 的DNA 序列为aaabbba,则感染, 患者2 的DNA 序列为babbba, 则未感染。(注意, 人的DNA 序列是线性的, 而病毒的DNA 序列是环状的

二、解决过程

  • 函数:virus_dna_extend()
int virus_dna_extend(char virus_src[], char virus_dst[][DNA_SIZE_MAX], int *num_of_virus)
{
	int virus_len = strlen(virus_src);
	int i = virus_len;
	int idx = 0;
	char *temp = (char *)malloc((2 * DNA_SIZE_MAX + 1) *sizeof(char));
	if (temp == NULL)
		return OVERFLOW;
	memset(temp, 0, (2 * DNA_SIZE_MAX + 1) * sizeof(char));
	memcpy(temp, virus_src, virus_len);

	for (int j = 0; j < virus_len; j++)
	{
		temp[i++] = temp[j];
	}
	temp[2 * virus_len + 1] = '\0';
	//printf("%s\n", temp);

	for (int i = 0; i < virus_len; i++)
	{
		for (int j = 0; j < virus_len; j++)
		{
			virus_dst[idx][j] = temp[i + j];
		}
		virus_dst[idx][virus_len + 1] = '\0';
		//printf("%s\n", virus_dst[idx]);
		idx++;
	}
	*num_of_virus = idx;
	free(temp);
	return 0;
}
  • 函数:virus_detect()
int virus_detect(const char *person_dna, const char virus_dna[][DNA_SIZE_MAX], int num_of_virus)
{
	int result = FALSE;
	for (int i = 0; i < num_of_virus; i++)
	{
		if (-1 != index_bf(person_dna, virus_dna[i], 0))
		{
			result = TRUE;
			break;
		}
	}
	return result;
}
  • 函数:main()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FALSE    0
#define TRUE     1
#define OVERFLOW 2

int main(void)
{
	char person_dna[10][DNA_SIZE_MAX] = {
		"bbaabbba",
		"aaabbbba",
		"abceaabb",
		"abaabcea",
		"cdabbbab",
		"cabbbbab",
		"bcdedbda",
		"bdedbcda",
		"cdcdcdec",
		"cdccdcce"
	};
	char virus_dna[10][2 * DNA_SIZE_MAX + 1] = {
		"baa",
		"baa",
		"aabb",
		"aabb",
		"abcd",
		"abcd",
		"abcde",
		"acc",
		"cde",
		"cced"
	};

	printf("病毒DNA              "
		   "患者DNA              "
		   "检测结果             \n");
	for (int i = 0; i < 10; i++)
	{
		char vir_dst[100][DNA_SIZE_MAX] = { 0 };
		const char *negative = "NO";
		const char *positive = "YES";
		int num_of_vir = 0;
		virus_dna_extend(virus_dna[i], vir_dst, &num_of_vir);
		int result = virus_detect(person_dna[i], vir_dst, num_of_vir);

		if (result == TRUE)
			printf("%-20s %-20s %-20s\n", virus_dna[i], person_dna[i], positive);
		else
			printf("%-20s %-20s %-20s\n", virus_dna[i], person_dna[i], negative);
	}
	return 0;
}

? 运行结果

BF算法的实现:病毒感染检测

三、反思总结

重点理解病毒DNA的扩展函数,至于BF算法函数请参考BF(Brute-Force)算法

例如:病毒DNA的序列是 abb ,由于它可以形成环结构,那么它的组成有 abbbbabab

如何分析得到病毒DNA所有可能性呢?

  • 第一步:扩展病毒DNA长度 ,例如 abbabb
	int virus_len = strlen(virus_src);
	int i = virus_len;
	char *temp = (char *)malloc(2* DNA_SIZE_MAX *sizeof(char));
	memset(temp, 0, (2 * virus_len + 1) * sizeof(char));
	memcpy(temp, virus_src, virus_len);

	for (int j = 0; j < virus_len; j++)
	{
		temp[i++] = temp[j];
	}
	temp[2 * virus_len + 1] = '\0';
  • 第二步:解析DNA的可能性,每次读三个字符,下一轮的读取开始位置是上一轮的开始位置+1
	for (int i = 0; i < virus_len; i++)
	{
		for (int j = 0; j < virus_len; j++)
		{
			virus_dst[idx][j] = temp[i + j];
		}
		virus_dst[idx][virus_len + 1] = '\0';
		idx++;
	}

四、参考引用

数据结构第二版:C语言版

原文链接:https://www.cnblogs.com/caojun97/p/17294920.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:BF算法的实现:病毒感染检测 - Python技术站

(0)
上一篇 2023年4月17日
下一篇 2023年4月17日

相关文章

  • c++结合opencv如何实现读取多张图片并显示

    为了做到 “c++结合opencv如何实现读取多张图片并显示”,我们可以按照以下步骤: 在C++中读取多个图像,并将它们存储到一个vector容器中; 对图像进行处理,例如调整大小、灰度化等; 用OpenCV中的imshow函数将图像显示出来。 现在我们来一步步实现。 读取多个图像 首先,我们需要找到要读取的图像的路径并将它们存储到一个vector容器中。下…

    C 2023年5月23日
    00
  • c/c++ 奇技淫巧(一些c语言的技巧)

    c/c++ 奇技淫巧(一些c语言的技巧) 1. 变量交换 有时我们需要交换两个变量的值,一般的做法是使用中间变量,但是有一个巧妙的方法可以不使用中间变量交换两个变量的值。 int a = 10, b = 5; a -= b; // a = 5 b += a; // b = 10 a = b – a; // a = 5 2. 求绝对值 结合位运算,可以使用以下…

    C 2023年5月23日
    00
  • 联想E450C怎么添加内存条?联想E450C拆机过程

    添加内存条的过程相对简单,但是还是需要谨慎操作,下面为您介绍联想E450C添加内存的完整攻略,包括拆机过程和具体步骤。 确认内存条类型 首先需要明确自己所需要购买的内存条的类型以及最大支持容量。联想E450C笔记本内存插槽总数为两个,最大支持容量为16GB。 拆卸电源 在添加内存条之前,需要先关闭电源并且断开电源适配器。然后,反转笔记本电脑,拆卸电源,以便后…

    C 2023年5月23日
    00
  • 头文件和库的区别

    头文件和库是C/C++中常用的两种代码重用方式,虽然它们都可以实现代码复用的功能,但是它们的细节和使用方式有所区别。 头文件的定义和使用 头文件的定义 头文件是一种特殊的源文件,包含一组函数、类或变量的声明。它的主要作用是让源文件能够访问所需的函数、类或变量定义,而不必再重新编写它们的代码。头文件的扩展名为.h。 头文件的使用 使用头文件的过程通常分为两步:…

    C 2023年5月10日
    00
  • 逍遥自在学C语言 | 逻辑运算符

    前言 一、人物简介 第一位闪亮登场,有请今后会一直教我们C语言的老师 —— 自在。 第二位上场的是和我们一起学习的小白程序猿 —— 逍遥。 二、构成和表示方式 逻辑运算符是用来比较和操作布尔值的运算符 C语言中的逻辑运算符主要有3个,如下表所示 运算符 名称 示例 描述 && 与 a && b 当a和b都为真时,返回真 || …

    C语言 2023年4月17日
    00
  • 深入解析C++程序中激发事件和COM中的事件处理

    深入解析 C++ 程序中激发事件和 COM 中的事件处理的攻略如下: 1. 什么是事件 事件是指在程序执行期间发生的动作或者状态变化,通常情况下需要在特定条件下触发。事件处理程序是由程序编写人员编写的一段代码,在事件触发时被执行。在 C++ 程序和 COM 中,都存在着事件的概念,因此需要掌握它们的事件处理方式。 2. C++ 中的事件处理 C++ 中的事件…

    C 2023年5月23日
    00
  • C/C++ 恨透了 double free or corruption

    *以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IwSVImp5cOB3gZbaf0YiPw 写过 C/C++ 的都知道,内存允许程序员自主分配,用完了这些资源也得释放出来,这种在系统运行过程中动态申请的内存,称为动态内存。 常言道,借东西好借好还,下次再借也不难,但是有的…

    C语言 2023年4月18日
    00
  • 基于C语言中段错误的问题详解

    基于C语言中段错误的问题详解 什么是段错误 在使用C语言开发时,经常会出现段错误(Segmentation Fault)的问题。所谓段错误,是指程序在访问某个内存地址时,访问了不该访问的内存,或者访问了系统保护的内存区域,导致程序崩溃。通常这种错误会导致程序退出,并输出类似于“Segmentation Fault”、“core dumped”或者“Bus E…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部