数据结构——基于字符串模式匹配算法的病毒感染检测

实验四 基于字符串模式匹配算法的病毒感染检测

【实验目的】
1.掌握字符串的顺序存储表示方法。
2.掌握字符串模式匹配BF算法和KMP算法的实现。
【实验内容】
问题描述
医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知它们的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”时输入结束。
输入样例
abbab abbabaab
baa cacdvcabacsd
abc def
0 0
输出样例
YES
YES
NO
【实验提示】
此实验内容即要求实现教材算法的具体案例。利用BF算法来实现字符串的模式匹配过程的,效率较低,。利用KMP算法完成模式匹配以提高算法的效率。

解决方法1:暴力算法

#include <stdio.h>  // printf(); scanf()
#include <stdlib.h> // exit()
#include <malloc.h> // malloc()
#include <time.h>   // srand((unsigned)time(NULL));
#include <string.h>#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0typedef int Status;typedef int ElemType;#define MAXSTRLEN 255                           
typedef unsigned char SString[MAXSTRLEN + 1];   Status StrAssign(SString &T, char *chars) {if(strlen(chars) > MAXSTRLEN)return ERROR;else {T[0] = strlen(chars);      for(int i=1; i<=T[0]; i++)T[i] = *(chars+i-1);return OK;}
}Status StrCopy(SString &T, SString S) {for(int i=0; i<=S[0]; i++)T[i] = S[i];return OK;
}int StrLength(SString S) {return S[0];
}int index(SString S,SString T,int pos)
{int i=pos,j=1;while(i<=S[0]&&j<=T[0]){if(S[i]==T[j]){++i;++j;}else {i=i-j+2;j=1;}}if(j>T[0])return i-T[0];else return 0;} int main()
{	int flag[100];int w=0; int x;int number;int pos;char  c[MAXSTRLEN+1],d[MAXSTRLEN+1];SString S;SString T;SString Z;do{scanf("%s",c);scanf("%s",d);StrAssign(S, c);StrAssign(T, d);char str[T[0]];for(int i=0; i<=S[0]; i++)str[i] = T[i+1];int i=0;Z[0]=T[0];for(i=0;i<T[0];i++){for(int j=1;j<=T[0];j++){Z[j]=str[(j+i)%(T[0])];	}number=index(S,Z,pos);if(number!=0&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0){flag[w++]=1;break; } }if(i==T[0]&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0)flag[w++]=0;}while(strcmp(c,"0")!=0&&strcmp(d,"0")!=0);for(int e=0;e<w;e++){if(flag[e]==1)printf("YES\n");//即在人体dna中找到与病毒dna相同的序列 elseprintf("NO\n");//即在人体dna中找到与病毒dna相同的序列 }	return 0;}

解决方法2:kmp算法

#include <stdio.h>  // printf(); scanf()
#include <stdlib.h> // exit()
#include <malloc.h> // malloc()
#include <time.h>   // srand((unsigned)time(NULL));
#include <string.h>#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0typedef int Status;
typedef int ElemType;
#define MAXSTRLEN 255                         
typedef unsigned char SString[MAXSTRLEN + 1];Status StrAssign(SString &T, char *chars) {if(strlen(chars) > MAXSTRLEN)return ERROR;else {T[0] = strlen(chars);       // 0号单元存放串的长度for(int i=1; i<=T[0]; i++)T[i] = *(chars+i-1);return OK;}
}Status StrCopy(SString &T, SString S) {for(int i=0; i<=S[0]; i++)T[i] = S[i];return OK;
}int StrLength(SString S) {return S[0];
}void get_next(SString T,int next[])
{int j; int i=1;next[1]=0;j=0;while(i<T[0]){if(j==0||T[i]==T[j]){i++;j++;next[i]=j;}else j=next[j];}
}int Index_KMP(SString S,SString T,int pos)
{	int next[MAXSTRLEN+1]; get_next(T,next);int i=pos;  int j=1;while(i<=S[0]&&j<=T[0])//i j都不超过其串的长度{//失配 //1:失配,当j==0时,则目标主串的检测指针前进一位,模式串检测指针回到T[1].进行下一趟的比较//2:失配,当j>0时,那么在下一趟比较时,模式串的起始位置为Tnext[j],目标主串S的检测指针不回溯,仍然指向上一趟失配的位置 if(j==0||S[i]==T[j]){++i;++j;//继续比较后继字符 }else j=next[j];//模式串向右移动 }if(j>T[0]) return i-T[0];//匹配成功 else return 0;
}int main()
{	int flag[100];int w=0; int x;int number;int pos;char  c[MAXSTRLEN+1],d[MAXSTRLEN+1];SString S;SString T;SString Z;do{scanf("%s",d);	scanf("%s",c);StrAssign(S, c);StrAssign(T, d);char str[T[0]];for(int i=0; i<=S[0]; i++)str[i] = T[i+1];int i=0;Z[0]=T[0];for(i=0;i<T[0];i++){for(int j=1;j<=T[0];j++){Z[j]=str[(j+i)%(T[0])];	}//StrPrint(Z); //printf("\n");number=Index_KMP(S,Z,pos);if(number!=0&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0){flag[w++]=1;break; } }if(i==T[0]&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0)flag[w++]=0;}while(strcmp(c,"0")!=0&&strcmp(d,"0")!=0);for(int e=0;e<w;e++){if(flag[e]==1)printf("YES\n");//即在人体dna中找到与病毒dna相同的序列 elseprintf("NO\n");//即在人体dna中找到与病毒dna相同的序列 }	return 0;}
解决方法3:kmp算法改进版```c
#include <stdio.h>  // printf(); scanf()
#include <stdlib.h> // exit()
#include <malloc.h> // malloc()
#include <time.h>   // srand((unsigned)time(NULL));
#include <string.h>#define TRUE    1
#define FALSE   0
#define OK      1
#define ERROR   0
typedef int Status;
typedef int ElemType;
#define MAXSTRLEN 255                         
typedef unsigned char SString[MAXSTRLEN + 1];   Status StrAssign(SString &T, char *chars) {if(strlen(chars) > MAXSTRLEN)return ERROR;else {T[0] = strlen(chars);       for(int i=1; i<=T[0]; i++)T[i] = *(chars+i-1);return OK;}
}int StrLength(SString S) {return S[0];
}void get_nextval(SString T,int nextval[])
{int j; int i=1;nextval[1]=0;j=0;while(i<T[0]){if(j==0||T[i]==T[j]){i++;j++;if(T[i]!=T[j])nextval[i]=j;else nextval[i]=nextval[j];}else j=nextval[j];}
}int Index_KMP_val(SString S,SString T,int pos)
{	int nextval[MAXSTRLEN+1]; get_nextval(T,nextval);int i=pos;  int j=1;while(i<=S[0]&&j<=T[0])//i j都不超过其串的长度{//失配 //1:失配,当j==0时,则目标主串的检测指针前进一位,模式串检测指针回到T[1].进行下一趟的比较//2:失配,当j>0时,那么在下一趟比较时,模式串的起始位置为Tnext[j],目标主串S的检测指针不回溯,仍然指向上一趟失配的位置 if(j==0||S[i]==T[j]){++i;++j;//继续比较后继字符 }else j=nextval[j];//模式串向右移动 }if(j>T[0]) return i-T[0];//匹配成功 else return 0;
}int main()
{	int flag[100];//用于计算循环数组  每次的结果 int w=0; //用于统计flag数组 int x;int number;int pos;char  c[MAXSTRLEN+1],d[MAXSTRLEN+1];SString S;SString T;SString Z;do{scanf("%s",d);	scanf("%s",c);StrAssign(S, c);StrAssign(T, d);char str[T[0]];for(int i=0; i<=S[0]; i++)str[i] = T[i+1];int i=0;Z[0]=T[0];for(i=0;i<T[0];i++){for(int j=1;j<=T[0];j++){Z[j]=str[(j+i)%(T[0])];	}number=Index_KMP_val(S,Z,pos);if(number!=0&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0){flag[w++]=1;break; } }if(i==T[0]&&strcmp(c,"0")!=0&&strcmp(d,"0")!=0)flag[w++]=0;}while(strcmp(c,"0")!=0&&strcmp(d,"0")!=0);for(int e=0;e<w;e++){if(flag[e]==1)printf("YES\n");//即在人体dna中找到与病毒dna相同的序列 elseprintf("NO\n");//即在人体dna中找到与病毒dna相同的序列 }	return 0;}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF 使用 Expression Design 画图导出及使用 Path 画图

WPF 使用 Expression Design 画图导出及使用 Path 画图目录WPF 使用 Expression Design 画图导出及使用 Path 画图一、软件介绍二、Microsoft Expression Design 使用三、微语言和 Path 绘图1、"注释" 图形&#xff08;中括号&#xff09;2、"并行模式" 图…

数据结构——模式匹配kmp算法

暴力算法 //暴力算法 int index(SString S,SString T,int pos) {int ipos,j1;while(i<S[0]&&j<T[0]){if(S[i]T[j]){i;j;}else {ii-j2;j1;}}if(j>T[0])return i-T[0];else return 0;} kmp算法 next[]数组的求法&#xff1a; 例子&#xff1a;abaabcac 模式串…

python实例化对象是什么意思_请帮我理解python对象的实例化.

我不是程序员,我正在尝试学习python.但我对对象实例化有点困惑.我认为Class就像模板一样,对象是基于模板制作(或实例化).这是否意味着一旦创建了对象(例如,classinst1 MyClass()),模板中的更改不应该影响对象中的内容&#xff1f; 此外,下面的代码显示我可以更改类变量“commo…

互联网时代供应链

供应链是指围绕核心企业&#xff0c;从配套零件开始&#xff0c;制成中间产品以及最终产品&#xff0c;最后由销售网络把产品送到消费者手中的、将供应商&#xff0c;制造商&#xff0c;分销商直到最终用户连成一个整体的功能网链结构。供应链管理的经营理念是从消费者的角度&a…

win7 计算器 android,教你巧妙应用Win7计算器和时钟

正文最新的Win7是一种个性化设计极强的操作系统&#xff0c;在许多细节方面都做到了人性化设计。其功能的DIY性非常明显&#xff0c;是XP系统远远不能比的。今天我们要说的是Win7计算器和时钟&#xff0c;除了可以计算和时间之外我们还可以让他们有哪些妙用呢&#xff1f;我们左…

python最大值_Python 获取最大值函数|python3教程|python入门|python教程

https://www.xin3721.com/eschool/pythonxin3721/ 以下实例中我们使用max()方法求最大值&#xff1a; # -*- coding: UTF-8 -*- # Filename : test.py # author by : www.w3cschool.cn # 最简单的 print(max(1, 2)) print(max(a, b)) # 也可以对列表和元组使用 print(max([1,2]…

真实经历:整整一年了,他是这样从程序员转型做产品经理的

这是头哥侃码的第224篇原创每年年底&#xff0c;有不少企业都会对一年内辛勤劳作的员工量身定做一些奖项。发个奖杯&#xff0c;给点奖金&#xff0c;让那些没得奖的人看看&#xff0c;咱们公司有多么的关注员工的闪光点&#xff0c;优秀之处。用人所长&#xff0c;容人所短&am…

数据结构—— 基于二叉树的算术表达式求值

实验五 基于二叉树的算术表达式求值 数据结构——中序表达式求值&#xff08;栈实现&#xff09; 实验目的&#xff1a; 1.掌握二叉树的二叉链表存储表示和二叉树的遍历等基本算法。 2.掌握根据中缀表达式创建表达式树的算法 3.掌握基于表达式树的表达式求值算法。 实验内容&a…

数字标牌 android,【浩鑫推出全球首款英特尔方案+Android系统数字标牌播放器】PjTime.COM 新品快讯 Intel...

世界知名迷你准系统领导品牌&#xff0d;浩鑫Shuttle&#xff0c;秉承开拓创新&#xff0c;引领行业发展的传统&#xff0c;此次创造性的推出全球首款采用英特尔硬件方案搭载Android系统的NS01A数字标牌播放器&#xff0c;为整个数字标牌行业贡献了全新的硬件解决方案。英特尔方…

python回到本次循环开头_Python中,当一个while循环判断为false,结束这个循环的时候,怎么进入到下一个循环中?...

根据题主对问题的描述&#xff0c;题主需要的答案也许是关于 while 循环结构&#xff0c;Continue 和 Break 的详细解释。了解了循环的控制后&#xff0c;题主便能很清楚地明白自己需要如何控制循环来达到想要的答案了。 先上干货&#xff1a; 1、while循环 如图所示&#xff0…

BCVP开发者说第3期:Adnc

沉静岁月&#xff0c;淡忘流年1项目简介AdncAdnc是一个轻量级的.NetCore微服务快速开发框架&#xff0c;同时也可以应用于单体架构系统的开发。框架基于JWT认证授权、集成了一系列微服务配套组件&#xff0c;代码简洁、易上手、学习成本低、开箱即用。    框架前端基于Vue、…

数据结构——二叉树的非递归算法

二叉树的非递归算法 先序遍历非递归算法1 先序遍历非递归算法2 非递归交换左右孩子算法 使用栈来实现二叉树的非递归算法 栈的基本算法 #include<stdio.h> #include<bits/stdc.h> typedef int Status; #define OK 1 #define ERROR 0 #define TRUE 1 #define …

signature=fc89d4352b6699754c14ce282ec75426,Method for Assembly of Nucleic Acid Sequence Data

摘要&#xff1a;The present invention relates to a method for assembly of nucleic acid sequence data comprising nucleic acid fragment reads into (a) contiguous nucleotide sequence segment(s), comprising the steps of: (a) obtaining a plurality of nucleic ac…

python字符串的表示_Python字符串方法总结

Python字符串方法图示&#xff1a; &#xff08;温馨提示&#xff1a;对图片点右键——在新标签页中打开图片&#xff09;1、index() 定义&#xff1a;查找并返回指定str的索引位置&#xff0c;如果没找到则会抛异常&#xff08;查找的顺序是从左至右&#xff09;可以指定范围&…

Kuma 1.0 GA发布,70多项新功能和改进

喜欢就关注我们吧&#xff01;Kuma 1.0 GA 现已发布&#xff0c;包含了 70 多种新功能和改进。Kuma 是一个现代的通用服务网格控制平面&#xff0c;基于 Envoy 搭建&#xff0c;Envoy 是一个为云原生应用设计的强大的代理软件。Kuma 高效的数据平面和先进的控制平面&#xff0c…

html圆点边框代码,HTML边框代码模板1

都说女人是男人的肋骨蜕变而来&#xff0c;是男人的心肝.可那一朵一朵微微卷起的发梢&#xff0c;点朱唇&#xff0c;纤细白皙的手指&#xff0c;踩着男人心底高跟鞋的我并不是他美丽的天使&#xff0c;往事在耳边环绕&#xff0c;现在的他人在那里&#xff0c;我不闻不问&…

递归函数斐波那契数列python_使用Python函数递归实现斐波那契数列时为什么运行速度很慢?...

你看看你递归代码的复杂度 是O(2^n) 而第二个的复杂度是O(n) 运行效率当然不同 COUNTER 0 def fibn(n): global COUNTER COUNTER 1 if n 0: return 1 elif n 1: return 1 else: return fibn(n-1) fibn(n-2) statistics [] for i in range(35): COUNTER 0 fibn(i 1) sta…

还在犹豫是否迁移.NET5?这几个项目已经上线了!

.NET5正式发布有十多天&#xff0c;博客园、知乎、技术群都讨论的非常热烈。关于项目是否迁移.NET5的话题讨论的尤为热烈&#xff0c;作为.NET十年老司机要告诉你&#xff0c;.NET5的迁移势在必行&#xff0c;当下就是最好的时机&#xff01;犹豫项目是否升级到.NET5的&#xf…

Android切换泰语,Android应用内切换语言

首先扯点别的&#xff1a;这是第一次在简书上写东西&#xff0c;我突然明白为啥这么多人在简书上写东西了&#xff0c;因为没有广告啊&#xff0c;哈哈。最近接触到Android 应用内切换语言的问题&#xff0c;研究了两天&#xff0c;做个记录先。实现了中文&#xff0c;英文&…

工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...

黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计第一标段招标公告招标编号&#xff1a;JTZGSJ20200011.招标条件本招标项目黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计已由上级部门批准建设&#xff0c;项目业主为哈尔滨交通集团有限公司&#xff0c;建设资金来…