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

阅读剩余 72%

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

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

相关文章

  • VC程序在Win32环境下动态链接库(DLL)编程原理

    VC程序在Win32环境下动态链接库(DLL)编程,主要原理是将一些可重复利用的函数和资源封装进动态链接库文件中,再由其他程序在需要时进行调用,从而提高代码重用性和程序的简洁性。以下是详细的攻略: 1. 创建DLL工程 首先,在VC中新建Win32 DLL工程,在“Win32 Application Wizard”对话框中选择“DLL”类型,之后通过向导一步…

    C 2023年5月23日
    00
  • 图文精讲java常见分布式事务理论与解决方案

    图文精讲Java常见分布式事务理论与解决方案 一、分布式事务概念 分布式事务指多个数据库或者多个应用之间的数据一致性问题。 例如,当一个事务需要涉及到多个数据库,并且这些数据库都需要成功地提交,才能使整个事务得以完成,此时就需要进行分布式事务的处理。 二、分布式事务的问题 在分布式环境下操作数据时,常常会出现下列问题: 并发问题:多个节点同时访问相同的数据;…

    C 2023年5月22日
    00
  • 在QT5中实现求两个输入值的和并输出(实例)

    下面我将为你讲解在QT5中实现求两个输入值的和并输出的完整攻略。首先,我们需要创建一个QT5项目,然后编写代码。 第一步:设计界面 首先,我们需要设计一个简单的界面,让用户可以输入两个值并计算它们的和。可以使用QT Designer来设计界面,也可以手动编写代码来创建相应的界面。 以下是一个简单的界面设计示例: <?xml version="…

    C 2023年5月24日
    00
  • C语言如何在字符数组中插入一个字符

    以下是使用C语言在字符数组中插入一个字符的详细攻略: 1. 按照索引位置分割字符数组 首先,我们需要对原始的字符数组进行分割,将需要插入字符的位置之前和之后的部分分别提取出来。 具体而言,对于一个字符数组 str 和需要插入字符的索引位置 index,我们可以分别使用 strncpy() 函数和指针运算来完成分割: char str[MAX_SIZE] = …

    C 2023年5月23日
    00
  • Linux管道通信C语言编程示例

    我们来详细讲解一下“Linux管道通信C语言编程示例”的完整攻略。 什么是Linux管道通信 Linux管道通信是一种进程间通信方式,它通过特殊的管道文件连接两个或多个进程,使数据在进程之间传递。简单来说,就是在两个进程之间建立一个管道,让它们可以通过这个管道进行数据交换。 管道通信C语言编程示例 下面我们就来看一下管道通信的C语言编程示例。这里我们介绍两个…

    C 2023年5月23日
    00
  • 简介C/C++预处理器的一些工作

    下面是详细的攻略: 简介C/C++预处理器的一些工作 预处理器是一种在编译源代码之前执行的程序,它实现了一些特殊的功能,例如宏替换、条件编译以及包含文件等操作。下面我们将详细讲解C/C++预处理器的一些工作。 宏替换 宏替换是预处理器的一个重要功能,它可以将代码中的宏名称替换为相应的宏值。宏定义可以使用#define关键字进行定义,例如: #define P…

    C 2023年5月23日
    00
  • C++编译器Clion的使用详解(总结)

    C++编译器Clion的使用详解(总结) 1. Clion简介 Clion是一款由JetBrains公司开发的跨平台C++开发工具。Clion具有强大的代码编辑和代码分析功能,还能够集成多个版本控制系统和调试器。它还提供了丰富的自动化功能,包括代码完成、调试、自动重构等等。 2. Clion的安装与配置 2.1. 安装Clion 首先,到JetBrains公…

    C 2023年5月23日
    00
  • 现代配置YAML对比JSON优势分析

    简介 本文将从以下几个方面来详细讲解“现代配置YAML对比JSON优势分析”: YAML和JSON的区别和优势; YAML在实际使用中的示例。 YAML和JSON的区别和优势 YAML和JSON都是现代配置中常用的数据序列化格式。它们具有以下区别和优势: YAML优势 对象比JSON更易读; 支持注释,更加可读性、可维护性; 支持多种数据类型(除了数字和字符…

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