Dot_Matrix点阵是序列比对的最基础算法

2025-10-19 14:23:18

1、代码如下:

public class Dot_Matrix_Java {

    public static void main(String[] args) {

        //输入两序列

        String s1="AACAAAAAACACAGTCGATCGATCGATCGATGCATGCAGCATGCTGATCAGCTACGATGC";//long

        String s2="AACAAAAAACACAGTCGATCGATCGATCGATGCATGCAGCATGCTGATCAG";//short

        //创建数组

        int[][] h=new int[s1.length()][s2.length()];

        //返回并输出点阵

        System.out.println("Result:");

        System.out.print(" ");

         for(int i=0;i<s2.length();i++){

                System.out.print(" "+s2.charAt(i)+" ");

            }

        System.out.println();

        for(int i=0;i<s1.length();i++){

             System.out.print(s1.charAt(i));

             for(int j=0;j<s2.length();j++){

                if(s1.charAt(i)==s2.charAt(j)){

                    System.out.print(" * ");

                    h[i][j]=1;

                }else{

                    System.out.print("   ");

                    h[i][j]=0;

                }

                if(j!=0&&j%(s2.length()-1)==0){

                    System.out.println();

                 }   

            }

        }

        //返回并输出打分矩阵

        System.out.println("Score_Matrix:");

        for(int i=0;i<h.length;i++){

           for(int j=0;j<h[0].length;j++){

               System.out.print(h[i][j]+" ");

               if(j!=0&&j%(s2.length()-1)==0){

                    System.out.println();

                 } 

           }

         }

        //回溯并输出结果

        String result=get_back(h,s1,s2);

        boolean count=false;

        StringBuffer sb=new StringBuffer();

        for(int i=0;i<result.length();i++){

            if(result.charAt(i)==' '){

                count=true;

            }else{

                if(count){

                    count=false;

                    sb.append(',');

                }

                 sb.append(result.charAt(i));

            }

        }

        System.out.println();

        System.out.println(sb.toString());     

    }

    //回溯方法

    public static String get_back(int [][] h,String s1,String s2){

        int num = 1;

        StringBuffer sb = new StringBuffer();

        for(int i=h[0].length-1;i>=0;i--){

            int j=h.length-1;

            for(int temp=i;temp>=0;temp--,j--){

                if(h[j][temp]==1){

                    sb.insert(0, s1.charAt(j));         

                }else{

                    sb.insert(0, ' ');

                }      

            }

            sb.insert(0, ' ');

        }

        for(int i=h.length-2;i>=0;i--){

            int j=h[0].length-1;

            if(i>j){

                    for(int temp=i;j>=0;temp--,j--){

                        if(h[temp][j]==1){

                           sb.insert(0, s1.charAt(temp));

                         }else{

                           sb.insert(0, ' ');

                        }

                    }  

            }else{

                  for(int temp=i;temp>=0;temp--,j--){

                         if(h[temp][j]==1){

                             sb.insert(0, s1.charAt(temp));

                         }else{

                               sb.insert(0, ' ');

                         }

                     }

            }

            sb.insert(0, ' ');

        }   

        return sb.toString();        

    }   

}

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

2、由以上代码得到的结果噪音多,背景复杂故对其进行优化,采用shift_frame方法

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

3、由shift_frame得到的结果清晰,直观

代码如下:

public class Dot_Matirx_shift_frame {

    public static void main(String[] args) {

         String s1="AACAAAAAACACAGTCGATCGATCGATCGATGCATGCAGCATGCTGATCAGCTACGATGC";

         String s2="AACAAAAAACACAGTCGATCGATCGATCGATGCATGCAGCATGCTGATCAG";

         int T=10;

         for(int i=0;i<s1.length()-T;i++){

             String sub_1=s1.substring(i,i+T);

             for(int j=0;j<s2.length()-T;j++){

                 String sub_2=s2.substring(j,j+T);

                 if(score(sub_1,sub_2)>=10){

                     System.out.print(" * ");

                 }else{

                     System.out.print("   ");

                 }

             }

             System.out.println();

         }

    }

    public static int score(String sub_1,String sub_2){

        int mark=0;

        for(int i=0;i<sub_1.length();i++){

            if(sub_1.charAt(i)==sub_2.charAt(i)){

                mark+=1;

            }

        }

        return mark;     

    }  

}

Dot_Matrix点阵是序列比对的最基础算法

Dot_Matrix点阵是序列比对的最基础算法

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢