当前位置: 首页 > 工具软件 > bwt > 使用案例 >

bwt比对算法 C语言,BWT以及BWTS算法的一点总结及看法

田谦
2023-12-01

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

layndown=(char **)malloc(sizeof(char*)*(lenth));

//line为读取的待处理数组,out为最终的处理结果

//数组a为记录主体处理部分while循环生成的每个layndown数组的元素个数

//动态数组b为layndown处理过程中的待判断动态字符快(是否为layndown)。layndown则为所记录的最长的layndown字符快

//

whilenum=0;cmp=0;c=1;reservei=0;

linenum=0;

//该while与for的嵌套动态循环完成了最长layndown模块的寻找

//实际上就是while完成待处理字符的逐个移动,linenum则是该移动的指针,for循环则是从该字符开始向后遍历,判断是否linenum与i之间

//的字符快是否为layndown word,并记录下最长的长度。在下一次while循环中则不需要再在layndown word中间移动了,直接从最长的layndown word

//后面开始

while(linenum

for(int i=linenum;i

free(b);

b=(char **)malloc(sizeof(char*)*(i+1-linenum));//申请二维动态数组,因为要对待处理快进行循环移位,拓展成二维,以进行layndown的判断

for(int j=0;j

b[j]=(char *)malloc(sizeof(char)*(i+1-linenum));

}

copy1(b[0],line,linenum,i+1); //将待处理的块拷贝入b数组中准备处理

movechar(b[0],i+1-linenum,b); //拓展成为二维

cmp=0;

c=0;

while(cmp==0&&c

if(strncmp(b[0],b[c],i+1-linenum)>0){

cmp=1;

}

c++;

}

if(cmp==0) //仅仅记录下layndown word的长度,因为他是不断覆盖的,最终记录的就是最长的。。。

reservei=i;

}

//接下来的一小段代码则是完成将每次for循环中生成的最长layndown word读取出来,储存在layndown word中,数组a中则是其长度的储存

//其中whilenum是while循环次数的记录

r=(char *)malloc(sizeof(char)*(reservei+1-linenum));

copy1(r,b[0],0,reservei+1-linenum);

a[whilenum]=reservei+1-linenum;

layndown[whilenum]=(char *)malloc(sizeof(char)*(reservei+1-linenum));

copy1(layndown[whilenum],r,0,reservei+1-linenum);

whilenum++;

linenum=reservei+1;

free(r);

}

free(b);

//下面则是对生成的layndown word分别进行循环移位的拓展,并将其进一步拓展为lenth*lenth的二维数组,并进行排序,生成输出。

int sum=0;

char end[lenth][lenth]; //输出之前的二维数组都将保存在end中

//int resa[lenth]; //记录下end中每一行的实际长度(拓展为lenth*lenth的二维数组之前的长度)

for(int cend=0;cend

for(int cend1=0;cend1

end[cend][cend1]=0;

}

}

for(int endnum=0;endnum

rr=(char **)malloc(sizeof(char*)*(a[endnum]));

for(int rrn=0;rrn

rr[rrn]=(char *)malloc(sizeof(char)*(a[endnum]));

}

movechar(layndown[endnum],a[endnum],rr); //每一个layndown word的循环移位

//free(layndown);

int rri=0;

//对应的长度记录也要拓展

for(int toend=sum;toend

copy1(end[toend],rr[rri],0,a[endnum]);

resa[toend]=a[endnum];

rri++;

}

sum=sum+a[endnum];

free(rr);

}

free(layndown);

//倒数第二步的lenth*lenth的拓展

for(int stend=0;stend

int mv=resa[stend];

int add=0;

for(;mv

end[stend][mv]=end[stend][add];

add++;

}

}

qsort(end,resa,0,lenth-1); //排序

comout(end,out,lenth); //生成输出数组

//putline(out,lenth);

long pos_file = ftell(read);//ftell函数返回stream流的当前文件位置

fseek(read,pos_file - lenth, SEEK_SET);//重新设置流stream的文件位置,将位置设置在需要写入数据的地方

fwrite(out,sizeof(char),lenth,read);

pos_file = ftell(read);

fseek(read,pos_file,SEEK_SET);//重新设置位置,使得fgets函数从正确位置开始读

}

fclose(read);

printf("算法结束\n");

end=clock();

cout<

return 0;

}

 类似资料: