2017-02-15 33 views
0

我有一個代碼來寫學校的基礎上的Needleman & Wunsch比對算法。 我寫基於什麼老師告訴我們的算法,所以也許不是100%相同的Needleman & Wunsch算法。Alignement算法

我連接到數據庫,得到2串,並與他們合作。 我創建一個矩陣,大小[N + 1] [N + 1]的第一列和具有間隙(-1)初始化線。

public String[] AlgoNeedWunsch(){ //construction de la matrice (initialisation des gap puis comparaison) 
    int i,j, init = 0; 
    StringBuilder aligne1 = new StringBuilder(); 
    StringBuilder aligne2 = new StringBuilder(); 

    matrice = new int[sequence1.length()+1][sequence2.length()+1]; 

    for(i = 0; i < sequence1.length()+1; i++){ 
     matrice[i][0] = init; 
     init --; 
    } 

    for(i = 0, init = 0; i < sequence2.length()+1; i++){ 
     matrice[0][i] = init; 
     init --; 
    } 


    for(i = 1; i <= sequence1.length(); i++){ 
     for(j = 1; j <= sequence2.length(); j++){ 
      if(sequence1.charAt(i-1) == sequence2.charAt(j-1)){ 
       matrice[i][j] = matrice[i-1][j-1] + 1; // si match, on ajoute le socre diag +1 
      } 
      else{ 
       if(matrice[i-1][j] > matrice[i][j-1]) 
        matrice[i][j] = matrice[i-1][j]-1; 
       else 
        matrice[i][j] = matrice[i][j-1]-1; 
      } 
     } 
    } 

//debut de l'alignement 

for(i = sequence1.length(), j = sequence2.length(); i > 0 || j > 0;){ 
     if(i > 0 && matrice[i][j] == matrice[i-1][j] + 1){ 
      aligne1.append(sequence1.charAt(i-1)); 
      aligne2.append("-"); 
      i--; 

     } 
     else if(j > 0 && matrice[i][j] == matrice[i][j-1] + 1){ 
      aligne2.append(sequence2.charAt(j-1)); 
      aligne1.append("-"); 
      j--; 

     } 
     else if(i > 0 && j > 0 && matrice[i][j] == matrice[i-1][j-1]){ 
      aligne1.append(sequence1.charAt(i-1)); 
      aligne2.append(sequence2.charAt(j-1)); 
      i--; 
      j--; 
     } 
    } 

    return new String[]{aligne1.reverse().toString(), aligne2.reverse().toString()}; 
} 
} 

但是,當我嘗試運行這個,它看起來像它永遠不會結束。我是Java初學者,所以我不知道我是否錯過了一些東西,或者它只是我算法中的一個問題。

非常感謝您的幫助。

回答

0

看起來像第二個for循環,因爲它依賴於i和j的所有減量都是可選塊內,有他們不會執行所有風險可以永遠運行。我會在調試模式下一步一步地運行程序,並檢查它是否爲真,如果是,那麼確切地說它開始發生。也許有一些額外的條件丟失。或者只是額外的'其他'塊,沒有任何條件,如果所有以前的檢查失敗,總是運行。

0

我認爲你的代碼的無限循環是最後的「For」語句。 將日誌放入每條if語句中,並檢查'​​i'或'j'是否減少。