[字符串匹配问题]【基于DNA的索引】一个用C语言解决生物信息学问题的例子,求指导
1我都目的是在一个基因序列中进行模式串匹配,找到所有能匹配的模式串,并输出其位置举个例子:给定一个DNA序列,这个系列只含有4个字母ATCG,如 S =“CTGTACTGTAT”。给定一个整数值k,从S的第一个位置开始,取一连续k个字母的短串,称之为k-mer(如k= 5,则此短串为CTGTA), 然后从S的第二个位置, 取另一k-mer(如k= 5,则此短串为TGTAC),这样直至S的末端,就得一个集合,包含全部k-mer 。 如对序列S来说,所有5-mer为
{CTGTA,TGTAC,GTACT,TACTG,ACTGT,TGTAT}
通常这些k-mer需一种数据索引方法,可被后面的操作快速访问。例如,对5-mer来说,当查询CTGTA,通过这种数据索引方法,可返回其在DNA序列S中的位置为{1,6}
2现在问题的规模很大,我截取了前几百个数据放在附件中了,我现在能做的就是把这些信息分成两类:表示生物物种信息的行和表示碱基序列的行,因为我觉得分开后查找应该更方便;
3可是接下来如何用C语言建立一个索引并使用索引进行查找我就犯难了,就算是用最土的暴力匹配我也不知如何嵌入,
希望编程能力强的大神指点指点,使建立使用索引的时间复杂度和空间复杂度尽量小,用时尽量少,所占用的内存尽量少;
我觉得自己的问题主要是不懂数据结构,可能要用到链表什么的,如果大神看过纳瓦罗的《柔性字符串匹配》又懂数据结构,这个问题一定不再话下吧!!!
附件.rar
(10.12 KB)
程序代码:
# include "stdio.h" # include "stdlib.h"//stdlib 头文件即standard library标准库头文件。stdlib.h里面定义了五种类型、一些宏和通用工具函数。 # include "time.h" # define N 5; void PreIndex();//建立索引文本,目录文本 void CatalogArray();//将目录文本存入目录 void IndexArray();//将索引文本存入目录 void Search();//进行查找 int main() { //PreIndex(); for (i=0; i<10000;i++) { CatalogArray(); IndexArray(); Search(); } printf("结束"); return 0; } void PreIndex() { FILE * fpIndex, * fpCatalog, * fpsource1, * fpsource2; fpCatalog = fopen("I:\\Catalog.txt","w"); fpIndex = fopen("I:\\Index.txt","w"); if ((fpsource1=fopen("I:\\c实验\\solexa_100_170_1.fa","r")) == NULL) { printf("Can't open the solexa_100_170_1.fa!\n"); getchar(); exit(-1); } if ((fpsource2=fopen("I:\\c实验\\solexa_100_170_2.fa","r")) == NULL) { printf("Can't open the solexa_100_170_2.fa!\n"); getchar(); exit(-1); } int i; char ch; char str[101]; for (i=0; i<500000; i++) { while ((ch=fgetc(fpsource1)) && (ch<'A' || ch>'T')) putc(ch,fpCatalog); fputc(ch,fpIndex); fgets(str,101,fpsource1); fputs(str,fpIndex); } for (i=0; i<500000; i++) { while ((ch=fgetc(fpsource2)) && (ch<'A' || ch>'T')) putc(ch,fpCatalog); fputc(ch,fpIndex); fgets(str,101,fpsource2); fputs(str,fpIndex); } fclose(fpIndex); fclose(fpsource1); fclose(fpsource2); } void CatalogArray() { FILE * fpIndex = fopen("I:\\c实验\\最后攻坚\\Index.txt","r"); FILE * fpCatalog = fopen("I:\c实验\最后攻坚\\Catalog.txt","r"); int i; char s[101],p[N]; for(i=0; i<1000000; i++) { fgets(s,101,fpCatalog); } }