基因序列比较 java实现

设计算法,计算两给定基因序列的相似程度。
人类基因由4种核苷酸,分别用字母ACTG表示。要求编写一个程序,按以下规则比较两个基因序列并确定它
们的相似程度。即给出两个基因序列AGTGATG和GTTAG,它们有多相似呢?测量两个基因相似度的一种方
法称为对齐。使用对齐方法可以在基因的适当位置加入空格,让两个基因的长度相等,然后根据基因的分值
矩阵计算分数。

看了很多代码基本上都是用c++或者c写的,但是习惯性写java就用java实现一下

在这里插入图片描述
基本的思路就是,和背包问题差不多,实现还是模仿填表的形式去实现的
表达式:

  • s1 = result[i-1][j-1] + getScore(X[i], Y[j]) 这个是x,y序列使用坐标匹配
  • s2 = result[i-1][j] + getScore(X[i], ‘-’) 这个是x序列匹配y的 ‘-’
  • s3 = result[i][j-1] + getScore(’-’, Y[j]) 这个是y序列匹配x的 ‘-’
  • result[i][j] = max(s1,s2,s3) 找出三个中最大的就是所求的值
package algorithmClassSet.three;

import java.util.HashMap;
import java.util.Map;

/**
 * s1 = result[i-1][j-1] + getScore(X[i], Y[j])  这个是x,y序列使用坐标匹配
 * s2 = result[i-1][j] + getScore(X[i], '-')   这个是x序列匹配y的 ‘-’
 * s3 = result[i][j-1] + getScore('-', Y[j])  这个是y序列匹配x的 ‘-’
 * result[i][j] = max(s1,s2,s3)   找出三个中最大的就是所求的值
 * m*n
 */

public class GeneSequenceComparison {
    public static void main(String[] args) {
        dealIt();
    }

    private static void dealIt() {
        String[] X = {"A", "G", "T", "G", "A", "T", "G"};
        String[] Y = {"G", "T", "T", "A", "G"};
        int m = X.length + 1;
        int n = Y.length + 1;
        int[][] result = new int[m][n];

        for (int i = 1; i < m; i++) {
            result[i][0] = result[i - 1][0] + getScore(X[i - 1], "-");
        }
        for (int j = 1; j < n; j++) {
            result[0][j] = result[0][j - 1] + getScore("-", Y[j - 1]);
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                int s1 = result[i - 1][j - 1] + getScore(X[i - 1], Y[j - 1]);
                int s2 = result[i - 1][j] + getScore(X[i - 1], "-");
                int s3 = result[i][j - 1] + getScore("-", Y[j - 1]);
                int maxs = getMax(s1, s2, s3);
                result[i][j] = maxs;
            }
        }
        System.out.println("结果为:" + result[m - 1][n - 1]);


        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(result[i][j] + "  ");
            }
            System.out.println();
        }
    }

    private static int getMax(int s1, int s2, int s3) {
        int flag = s1;
        if (flag < s2) {
            flag = s2;
        }
        if (flag < s3) {
            flag = s3;
        }
        return flag;
    }


    //传入值获取分数
    private static int getScore(String x, String y) {
        //x和y必须属于 ACGT-
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 0);
        map.put("C", 1);
        map.put("G", 2);
        map.put("T", 3);
        map.put("-", 4);
        int[][] score = {
                {5, -1, -2, -1, -3},
                {-1, 5, -3, -2, -4},
                {-2, -3, 5, -2, -2},
                {-1, -2, -2, 5, -1},
                {-3, -4, -2, -1, -10000000}};
        return score[map.get(x)][map.get(y)];
    }
}

在这里插入图片描述

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值