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日

相关文章

  • 详解Objective-C编程中对设计模式中适的配器模式的使用

    下面是详解Objective-C编程中对设计模式中适的配器模式的使用的完整攻略。 1. 什么是适配器模式? 适配器模式是一种结构型的设计模式,它用于将一个类的接口转换成另一个客户端所期望的接口。适配器模式允许已经存在的类在接口上进行适当的修改,从而让它们能够在新的场景下使用。在 Objective-C 程序设计中,适配器模式可以用来将某个类或者对象的接口转化…

    C 2023年5月23日
    00
  • 理光C3004SP打印机怎么安装驱动?

    安装驱动是使打印机正常工作的必要步骤,下面为您提供理光C3004SP打印机安装驱动的完整攻略: 步骤一:准备工作 首先需要从理光官网下载适合的驱动程序,可以在理光官网中找到C3004SP系列打印机对应的驱动程序。下载结束之后,需要解压缩驱动安装包。 步骤二:安装驱动程序 首先需要右键点击开始菜单,选择设备管理器。 在设备管理器中选择打印机,并右键选择添加打印…

    C 2023年5月23日
    00
  • 浅谈C语言数组元素下标为何从0开始

    关于C语言数组元素下标为何从0开始的问题,经过长期的发展和实践,现在已经成为C语言的基本规则之一。在这里,我将详细讲解为什么C语言数组下标从0开始,以及这种方式的优势和成本。 为什么C语言数组元素下标从0开始? 在C语言中,数组是一组数据的集合,它们具有相同的类型。数组中的每个元素都有一个唯一的索引,通过该索引可以访问该数组的元素。C语言数组元素下标从0开始…

    C 2023年5月23日
    00
  • C++ 如何判断四个点是否构成正方形

    判断四个点是否构成正方形是一个常见的问题,可以使用数学方法进行判断,也可以利用C++语言编写代码对四个点进行判断。 一、使用数学方法进行判断 如果四个点能构成正方形,那么它们应该满足以下条件: 四个点的四条边相等。 对角线相等。 两条对边之间的角度均为90度。 如果以上条件都满足,则四个点能构成正方形。 二、利用C++语言编写代码进行判断 以下是C++代码示…

    C 2023年5月23日
    00
  • IOS开发之路–C语言构造类型

    IOS开发之路–C语言构造类型 概述 在IOS开发中,C语言是必须要掌握的一门语言。而C语言中的构造类型在IOS开发中也有着广泛应用,例如结构体struct、枚举类型enum等等。本文将详细讲解C语言构造类型的使用步骤,以及在IOS开发中的应用。 结构体struct 结构体是一种将不同数据类型的数据按一定的顺序放在一起的自定义数据类型。在IOS开发中,结构…

    C 2023年5月23日
    00
  • 头文件“stdio.h”和“stdlib.h”之间的区别是什么

    “头文件“stdio.h”和“stdlib.h”之间的区别是什么”的完整使用攻略如下: 头文件的引入 在C语言中,头文件是对一些函数、宏和数据类型的声明,它们用于在程序中引用共享的代码,以避免在多个地方定义相同的内容。在C语言中,我们可以通过以下方式引入标准库中的头文件: #include <stdio.h> #include <stdli…

    C 2023年5月10日
    00
  • C 数据类型

    当我们使用 C 语言进行编程时,需要用到不同的数据类型来存储和操作不同的数据。C 语言中支持多种数据类型,包括整型、浮点型、字符型等。在本文中,我将详细讲解 C 数据类型的完整使用攻略,包括数据类型的定义、使用和常见问题等方面。 数据类型的定义 在 C 语言中,可用的数据类型包括基本数据类型和派生数据类型。 基本数据类型 C 语言中的基本数据类型包括整型、浮…

    C 2023年5月10日
    00
  • 使用eclipse搭建c/c++开发环境的详解步骤

    以下是使用Eclipse搭建C/C++开发环境的详解步骤: 1. 确认软件和环境 确保你已经安装了Eclipse和C/C++插件,以及C/C++编译器和调试器。其中常用的编译器有mingw和MSVC,调试器有GDB和LLDB等。 2. 创建C/C++项目 在Eclipse中创建一个C/C++项目。选择“File” -> “New” -> “C/C…

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