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

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

@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;
}
}

目录
相关文章
|
监控 安全 算法
137_安全强化:输入过滤与水印 - 实现输出水印的检测算法与LLM安全防护最佳实践
随着大语言模型(LLM)在各行业的广泛应用,安全问题日益凸显。从提示注入攻击到恶意输出生成,从知识产权保护到内容溯源,LLM安全已成为部署和应用过程中不可忽视的关键环节。在2025年的LLM技术生态中,输入过滤和输出水印已成为两大核心安全技术,它们共同构建了LLM服务的安全防护体系。
1045 148
|
传感器 资源调度 算法
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
本文提出一种多子带相干累积(MSCA)算法,通过引入空带和子带相干处理,解决DDMA-MIMO雷达的多普勒模糊与能量分散问题。该方法在低信噪比下显著提升检测性能,实测验证可有效恢复目标速度,适用于车载雷达高精度感知。
1312 4
DDMA-MIMO雷达多子带相干累积目标检测算法——论文阅读
|
开发框架 算法 .NET
基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA
简介:本文介绍基于ADMM的MIMO信号检测算法,结合无穷范数优化与交替方向乘子法,降低计算复杂度并提升检测性能。涵盖MATLAB 2024b实现效果图、核心代码及详细注释,并对比ML、MMSE、ZF、OCD_MMSE与LAMA等算法。重点分析LAMA基于消息传递的低复杂度优势,适用于大规模MIMO系统,为通信系统检测提供理论支持与实践方案。(238字)
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
508 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
机器学习/深度学习 运维 监控
实时异常检测实战:Flink+PAI 算法模型服务化架构设计
本文深入探讨了基于 Apache Flink 与阿里云 PAI 构建的实时异常检测系统。内容涵盖技术演进、架构设计、核心模块实现及金融、工业等多领域实战案例,解析流处理、模型服务化、状态管理等关键技术,并提供性能优化与高可用方案,助力企业打造高效智能的实时异常检测平台。
|
存储 监控 算法
基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
376 0
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
机器学习/深度学习 监控 算法
局域网行为监控软件 C# 多线程数据包捕获算法:基于 KMP 模式匹配的内容分析优化方案探索
本文探讨了一种结合KMP算法的多线程数据包捕获与分析方案,用于局域网行为监控。通过C#实现,该系统可高效检测敏感内容、管理URL访问、分析协议及审计日志。实验表明,相较于传统算法,KMP在处理大规模网络流量时效率显著提升。未来可在算法优化、多模式匹配及机器学习等领域进一步研究。
411 0
|
机器学习/深度学习 监控 算法
面向办公室屏幕监控系统的改进型四叉树屏幕变化检测算法研究
本文提出一种改进型四叉树数据结构模型,用于优化办公室屏幕监控系统。通过动态阈值调节、变化优先级索引及增量更新策略,显著降低计算复杂度并提升实时响应能力。实验表明,该算法在典型企业环境中将屏幕变化检测效率提升40%以上,同时减少资源消耗。其应用场景涵盖安全审计、工作效能分析及远程协作优化等,未来可结合深度学习实现更智能化的功能。
302 0
|
机器学习/深度学习 算法 安全
基于深度学习的路面裂缝检测算法matlab仿真
本项目基于YOLOv2算法实现高效的路面裂缝检测,使用Matlab 2022a开发。完整程序运行效果无水印,核心代码配有详细中文注释及操作视频。通过深度学习技术,将目标检测转化为回归问题,直接预测裂缝位置和类别,大幅提升检测效率与准确性。适用于实时检测任务,确保道路安全维护。 简介涵盖了算法理论、数据集准备、网络训练及检测过程,采用Darknet-19卷积神经网络结构,结合随机梯度下降算法进行训练。

热门文章

最新文章