2016-01-24 15 views
2

我試圖解決從rosalind.info生物信息學的問題,我鎖定了這個問題:http://rosalind.info/problems/mrna/PHP - 處理大量沒有將它們存儲

爲了解決它,你必須從計算不同RNA串的數量蛋白質可能被翻譯成模數1,000,000。

生物學背景:A protein是由20 amino acids組成的字符串,由20個不同的字母表示。每個氨基酸可以被多個RNA字符串替代(每個字母由3個字母組成)。

這個問題讓您瞭解如何在編程時管理大量數據,這是生物信息學中的一種常見情況。我嘗試了不同的東西,但我總是得到INF或負值,所以我做了一些壞事。

這些問題本身表明我應該找到一種操縱大量數據而不必存儲它們的方法。這怎麼可能?我如何用PHP實現這一目標?

這是我最好到現在爲止:

<?php function protein_reverse($sec) { 
    $sec_arr = str_split($sec); 
    $aa = array(
     'F' => '2', 
     'L' => '6', 
     'S' => '6', 
     'Y' => '2', 
     'C' => '2', 
     'W' => '1', 
     'P' => '4', 
     'H' => '2', 
     'Q' => '2', 
     'R' => '4', 
     'I' => '3', 
     'M' => '1', 
     'T' => '4', 
     'N' => '2', 
     'K' => '2', 
     'V' => '4', 
     'A' => '4', 
     'D' => '2', 
     'E' => '2', 
     'G' => '4', 
    ); 
    $r = 1; 
    foreach ($sec_arr as $base) { 
     $r *= $aa[$base] % 1000000; 
    } 
    return $r; 
} ?> 
+0

http://stackoverflow.com/questions/211345/working-with-large-numbers-in-php可以幫助你 – Gavriel

+0

提示:作爲熱身,你可以嘗試找到辦法,使數在你的程序中用括號括起數值操作的優先級顯式 – tomc

+0

@tomc我不理解你的評論,是什麼意思使「數字操作優先顯式」? – ThemesCreator

回答

0

我終於能夠解決的問題。首先,就像@Gavriel在評論中提到的問題一樣,我必須使用GMP庫來處理這些大數字操作。其次,我錯過了最後每3人的乘數。這是必要的,因爲如果蛋白質完成,必須有一個終止密碼子(secuence)。

/* 
    Reverse translation of protein 
    @return number of possible RNA strings modulo 1000000 
*/ 
function protein_reverse($sec) { 
    $sec_arr = str_split($sec); 
    $aa = array(
     'F' => '2', 
     'L' => '6', 
     'S' => '6', 
     'Y' => '2', 
     'C' => '2', 
     'W' => '1', 
     'P' => '4', 
     'H' => '2', 
     'Q' => '2', 
     'R' => '6', 
     'I' => '3', 
     'M' => '1', 
     'T' => '4', 
     'N' => '2', 
     'K' => '2', 
     'V' => '4', 
     'A' => '4', 
     'D' => '2', 
     'E' => '2', 
     'G' => '4', 
    ); 
    $r = 1; 
    foreach ($sec_arr as $base) { 
     $r = gmp_mul($r, $aa[$base]); 
    } 
    $r = gmp_mul($r, 3); 
    $r = gmp_mod($r, 1000000); 
    return $r; 
} 
相關問題