数据结构课设:基于字符串模式匹配算法的病毒感染检测问题

简介: 数据结构课设:基于字符串模式匹配算法的病毒感染检测问题

@TOC

一、Chapter One【实验题目】

1.【实验目的】

1.掌握字符串的顺序存储表示方法。2.掌握字符串模式匹配算法BF算法或KMP算法的实现。

2.【实验内容】

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

输入要求多组数据,每组数据有1行,为序列A和B,A对应病毒的DNA序列,B对应人的 DNA序列。A和B都为“0”时输入结束。输出要求对于每组数据输出1行,若患者感染了病毒输出“YES"”,否则输出“NO”。输人样例

abbab abbabaab
baa cacdvcabacsd
abc def
0 0

输出样例

YES
YES
NO

3.【实验提示】

此实验内容即要求实现主教材的案例4.1,具体实现可参考算法4.5。算法4.5是利用BF算法来实现字符串的模式匹配过程的,效率较低,可以利用KMP算法完成模式匹配以提高算法的效率。读者可以模仿算法4.5,利用KMP算法来完成病毒感染检测的方案。

二、Chapter Two【实验分析】

1.实验整体思路:

在本题中,我们采用BF算法来实现对病毒检测问题的描述,本程序的难点是如何找出病毒DNA环状字符串的所有展开字符串。原理:首先要传递参数到int judge函数中,将字符串长度为n的病毒DNA扩展为长度为2n的字符串,再用双重循环输出长度为m的病毒展开字符串。调用BF函数进行模式匹配,返回判断结果到主函数中。虑到程序需要输入输出多组数据,有两种方法可以实现:1、用二维数组进行字符串存储,并且同时进行字符串匹配,并将匹配结果输出。2、程序使用一维数组存储,在输入完一组数据后存储在缓存区内,然后将判断结果存入数组s中,最后根据数组s统一输出判断结果。本程序使用方法二。

实验详细步骤:

2.数据结构定义

定义全局变量数组V,D。char V[20]; //病毒DNA数组char D[20]; //人的DNA数组定义标识符YES为1,标识符NO为0#define YES 1#define NO 0

3.主要功能模块设计

(1)int BFjudge()函数:找出病毒DNA环状字符串的所有展开字符串,char D, char V:形参D是数组D,形参V是数组V。(2)int BF()函数:利用BF算法进行模式匹配char D, char :形参D是数组D,形参V是环状字符串的展开字符串。(3)int PRINThand()函数:输入多组数据,每输入一组数据就将匹配结果存进数组s中,最后统一输出检测结果。

4.主要步骤描述

(1)首先引用我们的头文件和需要的全局变量;(2)然后用模式匹配函数BF,进行模式匹配;(3)使用循环展开函数,将字符串长度为m的病毒DNA扩展为长度为2m的字符串;(4)再创建输入函数,输入病毒DNA及人的DNA,程序使用一维数组存储,在输入完一组数据后存储在缓存区内,然后将判断结果存入数组s中,最后根据数组s统一输出判断结果。;(5)最后通过主函数,调用我们之前已经构建好的函数,实现我们的判断功能,将结果进行输出。

三、Chapter Three【运行截图】

四、Chapter Four【源码详析】

include <stdio.h> //头文件

include

include <string.h>

define _CRT_SECURE_NO_WARNINGS

define YES 1

define NO 0

//全局变量部分
char V[20]; //病毒DNA字符串
char D[20]; //人的DNA字符串

//主要功能函数的具体实现及说明
//模式匹配函数(BF)
int BF(char D, char V)
{ //用BF算法进行模式匹配

int i=0,j=0;
while (i<strlen(D) && j<strlen(V))

{

if (D[i]==V[j]) 
{
    i++; j++;

}

  else
  {
         i = i-j+1;
         j = 0;
  }

}

if (j>=strlen(V)) return YES;
else return NO;

}

//循环展开函数(BFjudge)
int BFjudge(char D, char V)
{
int flag = 0;
int i,j,m;
char temp[20];
m = strlen(V);
for(i=m,j=0;j<m;j++) V[i++]=V[j];
V[2*m] = '\0'; //将字符串长度为m的病毒DNA扩展为长度为2m的字符串

for(i=0; ;i++)
{

  for(j=0;j<m;j++)    temp[j] = V[i+j];   
  temp[m] = '\0';  //循环展开环状病毒DNA
  flag = BF(D,temp);  //调用BF模块进行模式匹配
  if (flag) break;
  else if (i>=m) return NO;  //所有展开字符串均匹配失败
  else continue;

}
return YES;
}

// 程序使用一维数组存储,在输入完一组数据后存储在缓存区内,
// 然后将判断结果存入数组s中,最后根据数组s统一输出判断结果。
int PRINThand()
{
FILE fp1,fp2;

int i=0,k=0;
int s[20]; 

printf("\n请输入病毒DNA及人的DNA(输入0 0结束):\n");

while(1)

{           
  scanf("%s", &V[i]);
  scanf("%s", &D[i]);  
  if(V[i]=='0' && D[i]=='0') break;
  
    if(BFjudge(D, V)==1)   s[k]=1;
else   s[k]=0;
k++;
}

printf("病毒感染检测输出结果:\n");
for(k=0;s[k]<2;k++)
{

if(s[k]==1)  printf("YES\n");
  else  printf("NO\n");

}

return 0;

}

//主函数
int main()
{
int key = 0, Num;
while(1)
{
printf("欢迎使用病毒感染检测系统\n");
PRINThand(); break;
}
}

目录
相关文章
|
16天前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
50 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
20天前
|
机器学习/深度学习 存储 缓存
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
文章主要介绍了排序算法的分类、时间复杂度的概念和计算方法,以及常见的时间复杂度级别,并简单提及了空间复杂度。
18 1
数据结构与算法学习十:排序算法介绍、时间频度、时间复杂度、常用时间复杂度介绍
|
13天前
|
存储 算法 Java
Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性
Java Set因其“无重复”特性在集合框架中独树一帜。本文解析了Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定数据结构和算法确保元素唯一性,并提供了最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的hashCode()与equals()方法。
29 4
|
16天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
38 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
20天前
|
搜索推荐 算法
数据结构与算法学习十四:常用排序算法总结和对比
关于常用排序算法的总结和对比,包括稳定性、内排序、外排序、时间复杂度和空间复杂度等术语的解释。
14 0
数据结构与算法学习十四:常用排序算法总结和对比
|
3天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
12 0
|
13天前
|
前端开发 算法 JavaScript
无界SaaS模式深度解析:算力算法、链接力、数据确权制度
私域电商的无界SaaS模式涉及后端开发、前端开发、数据库设计、API接口、区块链技术、支付和身份验证系统等多个技术领域。本文通过简化框架和示例代码,指导如何将核心功能转化为技术实现,涵盖用户管理、企业店铺管理、数据流量管理等关键环节。
|
17天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
43 0
|
19天前
|
机器学习/深度学习 搜索推荐 算法
探索数据结构:初入算法之经典排序算法
探索数据结构:初入算法之经典排序算法
|
20天前
|
算法 Java 索引
数据结构与算法学习十五:常用查找算法介绍,线性排序、二分查找(折半查找)算法、差值查找算法、斐波那契(黄金分割法)查找算法
四种常用的查找算法:顺序查找、二分查找(折半查找)、插值查找和斐波那契查找,并提供了Java语言的实现代码和测试结果。
16 0