1

現在、スキューの違いを分析するスクリプトに取り組んでいます。残念ながら、私の問題は、文字列の長さが長くなると実行時間が長くなりすぎて、答えを計算できないように見えることです。

def SkewGC(file):
    countG = 0
    countC = 0
    diffGtoC = ""
    # first, we need to find number of G's.
    # the idea is, if G appears, we add it to the count.
    # We'll just do the same to each one.
    for pos in range(0,len(file)):
        if file[pos] == "G":
            countG = countG+1
        if file[pos] == "C":
            countC = countC+1
        diffGtoC = diffGtoC + str(countG-countC) + ","
    return diffGtoC.split(",")

SkewGCArray = SkewGC(data)
# This because I included extra "," at the end...
SkewGCArray = [int(i) for i in SkewGCArray[:len(SkewGCArray)-1]]

def min_locator(file):
    min_indices = ""
    for pos in range(0,len(file)):
        if file[pos] == min(file):
            min_indices = min_indices + str(pos) + " "
    return min_indices

print min_locator(SkewGCArray)

基本的に、このスクリプトは G と C (DNA のヌクレオチドに対応) の数を計算し、各位置での差を取得し、最小のインデックスを見つけようとしています。ファイルの長さ (入力文字列) が短い場合は問題なく動作しますが、長さが大きくなると (90000 以上のように)、スクリプトは実行されますが、適切な時間 (~4-5 分) で回答を解決できません。

より速くするために私ができることを誰かに教えてもらえますか? 差(diffGtoC)を求めてそれを最小値として設定し、それぞれの差を再計算して何か違うことがわかるまで、その間に最小値も置き換えた方がよいかどうかを考えました。

しかし、このアプローチで私が懸念していたのは、最小のインデックスを見つけて保持することです。私が言うなら、値を持つ配列がありました:

[-4,-2,-5,-6,-5,-6]

最小値を (-4 から -5 に、次に -6 に) 変更すると、アルゴリズムの実行時間が短縮されることがわかりますが、両方の -6 の位置を維持するにはどうすればよいでしょうか? これが完全に理にかなっているのかどうかはわかりません。

4

1 に答える 1