病毒感染检测

  • 一、实验题目
    • 1.案例分析
    • 2.案例实现
    • 3.算法步骤
    • 4.算法描述
  • 二、工具环境
  • 三、实验代码

一、实验题目

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

1.案例分析

因为患者的 DNA 和病毒 DNA 均是由一些字母组成的字符串序列, 要检测某种病毒 DNA 序列是否在患者的 DNA 序列中出现过 , 实际上就是字符串的模式匹配问题。可以利用 BF 算法,也可以利用更高效的KMP算法。但与一般的模式匹配问题不同的是,此案例中病毒的 DNA 序列是环状的, 这样需要对传统的 BF 算法或KMP算法进行改进。
下面给出利用 BF 算法实现检测的方案。

2.案例实现

对于每一个待检测的任务, 假设病毒 DNA 序列的长度是 m, 因为病毒 DNA 序列是环状的 ,为了线性取到每个可行的长度为 m 的模式串,可将存储病毒DNA序列的字符串长度扩大为 2m,将病毒DNA序列连续存储两次。然后循环m次,依次取得每个长度为m的环状字符串,将此字符串作为模式串,将人的DNA序列作为主串,调用BF算法进行模式匹配。 只要匹配成功,即可中止循环,表明该人感染了对应的病毒;否则,循环m次结束循环时, 可通过BF算法的返回值判断该人是否感染了对应的病毒。

3.算法步骤

1.从文件中读取待检测的任务数 num。
2.根据 num个数依次检测每对病毒DNA和人的DNA是否匹配,循环 num次,执行以下操作:
• 从文件中分别读取一对病毒DNA序列和人的DNA序列;
• 设置一个标志性变量flag, 用来标识是否匹配成功,初始为0, 表示未匹配;
• 病毒DNA序列的长度是 m, 将存储病毒DNA序列的字符串长度扩大为 2m, 将病毒DNA序列连续存储两次;
• 循环m次,重复执行以下操作:
► 依次取得每个长度为m的病毒DNA环状字符串;
► 将此字符串作为模式串,将人的DNA序列作为主串, 调用BF算法进行模式匹配,将匹配结果返回赋值给flag;
► 若flag非0, 表示匹配成功, 中止循环,表明该人感染了对应的病毒。
• 退出循环时, 判断flag的值,若flag非0, 输出 “YES” , 否则,输出 “NO”。

4.算法描述

void Virus detection ()
{//利用 BF 算法实现病毒检测ifstream inFile("病毒感染检测输入数据. txt"); ofstream outFile("病毒感染检测输出结果. txt"); inFile>>num; //读取待检测的任务数while(num--) //依次检测每对病毒 DNA 和人的 DNA 是否匹配{inFile>>Virus.ch+1; //读取病毒 DNA 序列, 字符串从下标 1 开始存放inFile>>Person.ch+1; //读取人的 DNA 序列Vir=Virus.ch; //将病毒 DNA 临时暂存在Vir中,以备输出flag=0; //用来标识是否匹配,初始为0, 匹配后为非0m=Virus.length; //病毒 DNA 序列的长度是 mfor(i=m+1, j=l; j<=m; j++) Virus.ch[i++]=Virus.ch[j]; //将病毒字符串的长度扩大2倍Virus.ch[2*m+1]='\0'; //添加结束符号for(i=0;i<m;i++) //依次取得每个长度为m 的病毒 DNA 环状字符串 temp{for (j=1; j<=m; j ++) temp.ch[j]=Virus.ch[i+j];temp.ch[m+1]='\0'; //添加结束符号flag=Index_BF (Person, temp, 1); //模式匹配if(flag) break; //匹配即可退出循环}// for if (flag) outFile<<Vir+l<<" "<<Person.ch+1<<" "<<"YES"<<endl; else outFile<<Vir+l<<" "<<Person.ch+1<<" "<<"NO"<<endl; }//while
}

二、工具环境

Window10操作系统,Microsoft Visual C++2010学习版 集成开发环境,C语言

三、实验代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>#define MAXLEN 255     //串的最大长度typedef struct{ char ch[MAXLEN+1]; //存储串的一维数组int length; //串的当前长度
}SString; typedef struct{ char Results[MAXLEN+1];//存放检测结果
}Detection;   int  Index_BF(SString S,SString T,int pos);
void Virus_detection(SString S[],SString T[],int num,Detection detection[]);int main()
{Detection detection[10];SString S[10]={{"bbaabbba",8},{"aaabbbba",8},{"abceaabb",8},{"abaabcea",8},{"cdabbbab",8},{"cabbbbab",8},{"bcdedbda",8},{"bdedbcda",8},{"cdcdcdec",8},{"cdccdcce",8}};SString T[10]={{"baa"  ,3},{"baa"  ,3},{"aabb" ,4},{"aabb" ,4},{"abcd" ,4},{"abcd" ,4},{"abcde",5},{"acc"  ,3},{"cde"  ,3},{"cced" ,4}};int num=10,i;Virus_detection(S,T,num,detection);printf("\t病毒DNA 人DNA \t检测结果\n");for(i=0;i<10;i++){printf("\t%-5s \t%s   %s\n",T[i].ch,S[i].ch,detection[i].Results);}return 0;
}int Index_BF(SString S,SString T,int pos)
{//返回模式T在主串s中第pos个字符开始第一次出现的位置.若不存在,则返回值为0int i,j;i=pos; j=0; //初始化while(i<S.length && j<T.length) //两个串均未比较到串尾{if(S.ch[i]==T.ch[j]){i++;j++;} //继续比较后继字符else{i=i-j+1;j=0;} //指针后退重新开始匹配}if (j >= T.length) return 1;//匹配成功else return 0; //匹配失败
}void Virus_detection(SString S[],SString T[],int num,Detection detection[])
{//利用 BF 算法实现病毒检测SString Person,Virus,temp;int i,j,m,flag,k=0;char Vir[10];while(num--) //依次检测每对病毒 DNA 和人的 DNA 是否匹配{Person=S[k];Virus=T[k];strcpy(Vir,Virus.ch); //将病毒 DNA 临时暂存在Vir中,以备输出flag=0; //用来标识是否匹配,初始为0, 匹配后为非0m=Virus.length; //病毒 DNA 序列的长度是 mfor(i=m, j=0; j<m; j++){Virus.ch[i++]=Virus.ch[j]; //将病毒字符串的长度扩大2倍}Virus.ch[2*m]='\0'; //添加结束符号for(i=0;i<m;i++) //依次取得每个长度为m 的病毒 DNA 环状字符串 temp{for (j=0; j<m; j++) temp.ch[j]=Virus.ch[i+j];temp.ch[m]='\0'; //添加结束符号temp.length=Virus.length;flag=Index_BF (Person, temp, 0); //模式匹配if(flag) break; //匹配即可退出循环}// for if(flag) strcpy(detection[k].Results,"YES");else strcpy(detection[k].Results,"NO");k++;}//while
}

病毒感染检测(数据结构串,c语言版)相关推荐

  1. 资料分享:送你一本《数据结构(C语言版)》电子书!

    要想写出可复用.可扩展.易维护.灵活性好的代码,「数据结构」这一关必须要过啊! 在数据结构与算法的众多教材中,奉为经典的当属清华大学严蔚敏老师的著作.很多学校也选择这本书作为考研指定教材. 正在学习数 ...

  2. 资料分享:送你一本《数据结构(C#语言版)》电子书!

    对于信息类专业的学生而言,数据结构与算法是一门必修的课程.只有学好这门课程,熟练掌握线性表.栈.队列.树.图等基本结构,以及在这些结构上的各种算法,才能利用计算机去解决实际问题. 如何学好这门课程呢, ...

  3. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  4. 数据结构c语言版入门教材,《数据结构(C语言版)》C语言-教材-数据结构.pdf

    数 据 结 构 ( C 语 言版 ) 孟祥瑞 汤文兵 编著 胡胜利 葛 斌 华东理工大学出版社 内 容 提 要 <数据结构>(C 语言版) 是为"数据结构"课程编写 的 ...

  5. <初识数据结构+算法实现>数据结构(C语言版)

    新晓本已悦人心,故知更加理解深! 目录 前言: ●本篇博文基于<数据结构>(C语言版)严蔚敏教授.吴伟民教授.李冬梅教授编著的教材知识及框架主线,以及参考借阅其他相关资料,结合作者的学习所 ...

  6. 数据结构(C语言版)严蔚敏 吴伟民 编著 第1章 绪论

    数据结构(C语言版)严蔚敏 吴伟民 编著 第1章 绪论 1.1 什么是数据结构? 1.2 基本概念和术语 1.3 抽象数据类型的表示与实现 1.4 算法和算法分析 1.4.1 算法 1.4.2 算法设 ...

  7. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  8. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  9. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

  10. 严蔚敏版《数据结构 (C语言版)》和《数据结构题集》(一)

    这里用的是严蔚敏版<数据结构 (C语言版)>和<数据结构题集>,深感自己的代码写得又渣又无力,打算把这本书好好琢磨透彻,里面的算法和模板都实现一遍,题目也都做一遍.最终能够做到 ...

最新文章

  1. Hadoop的存储架构介绍
  2. python语言接口_Python-接口自动化(一)
  3. 多硬盘的引导文件boot.ini
  4. Mysql:This version of MySQL doesn’t yet support ‘LIMIT IN/ALL/ANY/SOME 错误解决
  5. OSI、TCP/IP or Five-layer(Protocols Use) Model
  6. js中遇到的一个错误Uncaught SyntaxError: missing )after argument list
  7. oracle 常用调优方法
  8. Docker持续交付部署类型
  9. java中String类是什么_Java中字符串的学习(一)String类的概述及常见方法使用
  10. windows下升级nodenpm
  11. matlab绘制庞加莱截面_如何用mathematica或Matlab画弹性摆的庞加莱截面
  12. 计算机文化基础(高职高专版 第十一版)第六章 答案
  13. Excel表格自动填充、批量提取与组合数据
  14. HR问:“你为什么离开上一家公司?”,这样回答最机智
  15. 基于LSTM算法的股票预测
  16. 关于将数据写入文件的两个函数fwrite()与fprintf()的大不同 —————— 开开开山怪
  17. Android 百度地图导航引擎初始化失败
  18. 2011-1 开篇,要确定好方向
  19. 英语基础知识:句子类型
  20. MVC依赖注入Unity应用学习

热门文章

  1. RPG游戏制作-01-搭建游戏框架,初进游戏世界
  2. Mysql的原子性、持久性原理
  3. docker搭建snipe-it
  4. 面向对象编程训练:模拟购物车模块(:3[▓▓]快醒醒开学了
  5. Advised,Advisor,Advice,Pointcut
  6. iterative(迭代的) 和recursive(递归的)的区别
  7. JavaScript中的作用域及作用域链
  8. 达人评测 联想YOGA Duet 2021
  9. 移动端开发兼容性处理整理
  10. NodeJS实现HTTP/HTTPS代理 - 刘春龙的博客