KMP 病毒感染检测

模拟基因序列

in.people

ATGCUGACTUGCATUCTUGCUGACCTUGCATUUUGCATUCTUGUGCATUCTUGUGCATUCTUGUGCUGACCTUGCATUGACTUGCATUCTUGCUGACCCATUGACTUGCATUUGACCTUGCATUUUACCCATUGACTUCUGACCCATUGACUGACCCCCATUCTUGCUGACCCATUGACUGCUGACCTUGCATUUCATUCTUGCUGACUGACCTUGCACTUGCATUCTUGACCTUGCATUUACCCATUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGACUGATTGCUAUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGCACTUACCACCTUGCAACUGACCTUGCACTUACCACCTUGCACCTUGCACATUCTUUCTUGCUGACCCUGACCUGACCCATUGACUGACGCACTUGCATUTUCTUGACCUGACCACCTUGCATUUACCCATUTUGCATUTCTUGCUGACCATUGACUGGCUATACCCCCATUCTUGACCUUGCUGACCCUGCCTUGCATUUACCCATUGACTUGCAUGACUGCUGCCCATUGUGCACTUGCGCUGACCCCTUGCAUGACUGCUGUGAGACTTUGACTUGCUGACCTUGCUGACCTUGCCTUGCACTUTUGACCTUGCUGACUATGATCATCCUU

in.virus

ATGCU
#include<iostream>
#include<fstream>
#define MAX 700
#define RIGHT 1
using namespace std;
//串的声明
typedef struct {
	char ch[MAX];
	int length;
} str;
int KMP(str s,str t,int pos=1);
void getNext(str s,int next[]);
//KMP匹配函数
int KMP(str s,str t,int pos) {
	int next[t.length+1];
	getNext(t,next);

	int i=pos;
	int j=1;

	while(i<=s.length && j<=t.length) {
		if(j==0 || s.ch[i-1]==t.ch[j-1]) {
			i++;
			j++;
		} else {
			j=next[j];
		}
	}
	if(j>t.length) {
		return(i-t.length);
	} else {
		return 0;
	}
}
//next数组形成函数
void getNext(str s,int next[]) {
	int i=1;
	int j=0;
	next[i]=j;
	while(i<=s.length) {
		if(j==0 || s.ch[i-1]==s.ch[j-1]) {
			i++;
			j++;
			next[i]=j;
		} else {
			j=next[j];
		}
	}
}
//文件加载函数
void load(string fileName,str &s) {
	fstream inFile;
	inFile.open(fileName.c_str());
	s.length=0;
	inFile>>s.ch[s.length];
	while(!inFile.eof()) {
		s.length++;
		inFile>>s.ch[s.length];
	}
	inFile.close();
}
//查看串
int scanString(str s) {
	for(int i=0; i<s.length; i++) {
		cout<<s.ch[i];
	}
	cout<<endl;
	cout<<"&序列长度:"<<s.length<<endl;
	return RIGHT;
}
int main(void) {
	int l,i,flag,j,buf;
	str virus,people;
	load("in.virus",virus);
	load("in.people",people);
	cout<<"***模拟的被检测人类基因序列片段***"<<endl;
	scanString(people);
	cout<<endl;
	cout<<"***模拟的被检测病毒序列***"<<endl;
	scanString(virus);
	cout<<"-----------------------检测结果--------------------------"<<endl;;
	l=virus.length;
	for(i=0; i<l; i++) { //循环以实现环状基因的轮转
		flag=KMP(people,virus);
		if(flag) {
			cout<<"!!! 检测到环状病毒基因";
			for(j=0; j<l; j++) {
				cout<<virus.ch[j];
			}
			cout<<","<<"第一次出现于人体基因序列片段第"<<flag<<"位"<<endl;
		}
		//对病毒基因串进行变换,使其出现环状的每一种情况
		buf=virus.ch[0];
		for(j=0; j<l-1; j++) {
			virus.ch[j]=virus.ch[j+1];
		}
		virus.ch[l-1]=buf;
	}
	return 0;
}

定义了两个串,分别是从文件in.people输入人类基因序列,从in.virus输入病毒基因序列,随后采用KMP算法进行匹配。结果将显示环状基因各种情况下的第一次在人类基因串出现的位置。

猜你喜欢

转载自blog.csdn.net/UZDW_/article/details/113528915
kmp