現在、スキューの違いを分析するスクリプトに取り組んでいます。残念ながら、私の問題は、文字列の長さが長くなると実行時間が長くなりすぎて、答えを計算できないように見えることです。
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 の位置を維持するにはどうすればよいでしょうか? これが完全に理にかなっているのかどうかはわかりません。