グローバルアラインメント

2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。

2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。

  • タグ:
  • タグはありません
#include<stdio.h>
#include<string.h>
#define SMAX 64
#define MATCH 2
#define UNMATCH -1
#define GAP -1
int main(void){
char str1[] = "ATGCGGATTCAGAT";
char str2[] = "ATGATCCGT";
char str3[2*SMAX];
char str4[2*SMAX];
int m[SMAX][SMAX];
int w, h, i, j, k;
//
w = strlen(str1) + 1;
h = strlen(str2) + 1;
for(i = 0; i < w; i++){
m[i][0] = 0;
}
for(j = 0; j < h; j++){
m[0][j] = 0;
}
//
for(j = 1; j < h; j++){
for(i = 1; i < w; i++){
int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;
int max = m[i-1][j-1] + s;
if(max < m[i-1][j] + GAP){
max = m[i-1][j] + GAP;
}else if(max < m[i][j-1] + GAP){
max = m[i][j-1] + GAP;
}
m[i][j] = max;
}
}
//
for(j = 0; j < h; j++){
for(i = 0; i < w; i++){
printf("%2d ", m[i][j]);
}
puts("");
}
//
i = w - 1;
j = h - 1;
k = SMAX - 1;
str3[k] = '';
str4[k] = '';
while( !(i == 0 && j == 0) ){
int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;
if(m[i-1][j-1] + s == m[i][j]){
k--;
str3[k] = str1[--i];
str4[k] = str2[--j];
}else if(m[i-1][j] + GAP == m[i][j] || j == 0){
k--;
str3[k] = str1[--i];
str4[k] = '_';
}else if(m[i][j-1] + GAP == m[i][j] || i == 0){
k--;
str3[k] = '_';
str4[k] = str2[--j];
}
}
//
puts(&str3[k]);
puts(&str4[k]);
return 0;
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX