java實(shí)現(xiàn)基因序列比較的示例代碼
設(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)一下
基本的思路就是,和背包問(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)]; } }
到此這篇關(guān)于java實(shí)現(xiàn)基因序列比較的示例代碼的文章就介紹到這了,更多相關(guān)java 基因序列比較內(nèi)容請(qǐng)搜素腳本之家以前的文章或下面相關(guān)文章,希望大家以后多多支持腳本之家!
相關(guān)文章
Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法詳解
文件上傳是大家應(yīng)該都不陌生的一個(gè)功能,最近在開(kāi)發(fā)中就又遇到了這個(gè)需求,所以想著總結(jié)一下方便以后需要的時(shí)候參考,下面這篇文章主要給大家介紹了關(guān)于Spring MVC環(huán)境中文件上傳功能的實(shí)現(xiàn)方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10springBoot 與neo4j的簡(jiǎn)單整合示例
這篇文章主要介紹了springBoot 與neo4j的簡(jiǎn)單整合示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-01-01從前端Vue到后端Spring Boot接收J(rèn)SON數(shù)據(jù)的正確姿勢(shì)(常見(jiàn)錯(cuò)誤及問(wèn)題)
這篇文章主要介紹了從前端Vue到后端Spring Boot接收J(rèn)SON數(shù)據(jù)的正確姿勢(shì)(常見(jiàn)錯(cuò)誤及問(wèn)題),本文將從前端Vue到后端Spring Boot,詳細(xì)介紹接收J(rèn)SON數(shù)據(jù)的正確姿勢(shì),幫助開(kāi)發(fā)人員更好地處理JSON數(shù)據(jù),感興趣的朋友一起看看吧2024-02-02MyBatis 如何配置多個(gè)別名 typeAliasesPackage
這篇文章主要介紹了MyBatis 如何配置多個(gè)別名 typeAliasesPackage,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Springboot jpa @Column命名大小寫問(wèn)題及解決
這篇文章主要介紹了Springboot jpa @Column命名大小寫問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯
Log4j?是Apache為Java提供的日志管理工具。他與System.out.println()的作用相似,用來(lái)跟蹤、調(diào)試、維護(hù)程序。這篇文章主要介紹了關(guān)于log4j漏洞修復(fù)解決方案及源碼編譯,需要的朋友可以參考下2021-12-12詳解spring security四種實(shí)現(xiàn)方式
這篇文章主要介紹了詳解spring security四種實(shí)現(xiàn)方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11