KMP 病毒感染检测

模拟基因序列

KMP 病毒感染检测_第1张图片

in.people

ATGCUGACTUGCATUCTUGCUGACCTUGCATUUUGCATUCTUGUGCATUCTUGUGCATUCTUGUGCUGACCTUGCATUGACTUGCATUCTUGCUGACCCATUGACTUGCATUUGACCTUGCATUUUACCCATUGACTUCUGACCCATUGACUGACCCCCATUCTUGCUGACCCATUGACUGCUGACCTUGCATUUCATUCTUGCUGACUGACCTUGCACTUGCATUCTUGACCTUGCATUUACCCATUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGACUGATTGCUAUGACTTUGUGACCCATUGACCCTUGCATUUACCCATUCTUGACCUGACCCATUGCACTUACCACCTUGCAACUGACCTUGCACTUACCACCTUGCACCTUGCACATUCTUUCTUGCUGACCCUGACCUGACCCATUGACUGACGCACTUGCATUTUCTUGACCUGACCACCTUGCATUUACCCATUTUGCATUTCTUGCUGACCATUGACUGGCUATACCCCCATUCTUGACCUUGCUGACCCUGCCTUGCATUUACCCATUGACTUGCAUGACUGCUGCCCATUGUGCACTUGCGCUGACCCCTUGCAUGACUGCUGUGAGACTTUGACTUGCUGACCTUGCUGACCTUGCCTUGCACTUTUGACCTUGCUGACUATGATCATCCUU

in.virus

ATGCU
#include
#include
#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

KMP 病毒感染检测_第2张图片

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

 

你可能感兴趣的:(数据结构与算法)