溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java如何實(shí)現(xiàn)基因序列比較

發(fā)布時(shí)間:2021-04-14 13:57:20 來(lái)源:億速云 閱讀:240 作者:小新 欄目:編程語(yǔ)言

這篇文章將為大家詳細(xì)講解有關(guān)java如何實(shí)現(xiàn)基因序列比較,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

設(shè)計(jì)算法,計(jì)算兩給定基因序列的相似程度。

人類基因由4種核苷酸,分別用字母ACTG表示。要求編寫一個(gè)程序,按以下規(guī)則比較兩個(gè)基因序列并確定它們的相似程度。即給出兩個(gè)基因序列AGTGATG和GTTAG,它們有多相似呢?測(cè)量?jī)蓚€(gè)基因相似度的一種方法稱為對(duì)齊。使用對(duì)齊方法可以在基因的適當(dāng)位置加入空格,讓兩個(gè)基因的長(zhǎng)度相等,然后根據(jù)基因的分值矩陣計(jì)算分?jǐn)?shù)。

看了很多代碼基本上都是用c++或者c寫的,但是習(xí)慣性寫java就用java實(shí)現(xiàn)一下

java如何實(shí)現(xiàn)基因序列比較

基本的思路就是,和背包問(wèn)題差不多,實(shí)現(xiàn)還是模仿填表的形式去實(shí)現(xiàn)的

表達(dá)式:

  • s1 = result[i-1][j-1] + getScore(X[i], Y[j]) 這個(gè)是x,y序列使用坐標(biāo)匹配

  • s2 = result[i-1][j] + getScore(X[i], ‘-') 這個(gè)是x序列匹配y的 ‘-'

  • s3 = result[i][j-1] + getScore('-', Y[j]) 這個(gè)是y序列匹配x的 ‘-'

  • result[i][j] = max(s1,s2,s3) 找出三個(gè)中最大的就是所求的值

package algorithmClassSet.three;

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

/**
 * s1 = result[i-1][j-1] + getScore(X[i], Y[j]) 這個(gè)是x,y序列使用坐標(biāo)匹配
 * s2 = result[i-1][j] + getScore(X[i], '-')  這個(gè)是x序列匹配y的 ‘-'
 * s3 = result[i][j-1] + getScore('-', Y[j]) 這個(gè)是y序列匹配x的 ‘-'
 * result[i][j] = max(s1,s2,s3)  找出三個(gè)中最大的就是所求的值
 * 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("結(jié)果為:" + 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;
  }


  //傳入值獲取分?jǐn)?shù)
  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)];
  }
}

java如何實(shí)現(xiàn)基因序列比較

關(guān)于“java如何實(shí)現(xiàn)基因序列比較”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI