簡體   English   中英

python遞歸與冒泡排序

[英]python recursion with bubble sort

所以,我有這個問題,我收到兩串字母ACGT,一個只有字母,另一個包含字母和短划線“ - ”。兩者都是相同的長度。 將帶有破折號的字符串與沒有它的字符串進行比較。 細胞細胞。 對於每個配對我都有一個評分系統。 我為評分系統編寫了這段代碼:例如:dna1:-ACA dna2:TACG得分為-1。 (因為破折號與字母(T)相比給出-2,字母與同一字母相比給出+1(A到A),+ 1(C到C)和非相似字母給(-1)所以sum是-1。

def get_score(dna1, dna2, match=1, mismatch=-1, gap=-2):
""""""

score = 0

for index in range(len(dna1)):
    if dna1[index] is dna2[index]:
        score += match
    elif dna1[index] is not dna2[index]:
        if "-" not in (dna1[index], dna2[index]):
            score += mismatch
        else:
            score += gap

這工作正常。

現在我必須使用遞歸來為2個字符串提供最好的分數。 我收到2根琴弦,這次可以有不同的尺寸。 (我不能改變字母的順序)。 所以我寫了這個代碼,在短字符串中添加“ - ”多次,以創建2個相同長度的字符串,並將它們放在列表的開頭。 現在我想開始移動破折號並記錄每個破折號位置的得分,最后獲得最高的posibble分數。 因此,為了移動破折號我寫了一個小泡泡排序..但它似乎做我想要的東西。 我意識到這是一個很長的問題,但我會喜歡一些幫助。 如果我寫的任何內容都不明白,請告訴我。

def best_score(dna1, dna2, match=1, mismatch=-1, gap=-2,\
                         score=[], count=0):
""""""

diff = abs(len(dna1) - len(dna2))

if len(dna1) is len(dna2):
    short = []
elif len(dna1) < len(dna2):
    short = [base for base in iter(dna1)]
else:
    short = [base for base in iter(dna2)]

for i in range(diff):
    short.insert(count, "-")

for i in range(diff+count, len(short)-1):
    if len(dna1) < len(dna2):
        score.append((get_score(short, dna2),\
                      ''.join(short), dna2))
    else:
        score.append((get_score(dna1, short),\
                      dna1, ''.join(short)))
    short[i+1], short[i] = short[i], short[i+1]

if count is min(len(dna1), len(dna2)):
    return score[score.index(max(score))]
return best_score(dna1, dna2, 1, -1, -2, score, count+1)

首先,如果我正確地推斷了您的成本函數,您的最佳得分值不依賴於差距,因為破折號的數量是固定的。

其次,它是線性的,取決於不匹配的數量,因此不依賴於匹配和不匹配的精確值,只要它們分別為正和負。

因此,您的任務減少為查找最長字符串字母的最長子序列,嚴格匹配最短字母的子序列。

第三,通過M(string, substr)函數定義從上面得到的最佳匹配長度。 如果你最小的字符串fisrt字母是S ,那就是substr == 'S<letters>' ,那么

M(string, 'S<letters>') = \
    max(1 + M(string[string.index(S):], '<letters>') + # found S
            M(string[1:], '<letters>')) # letter S not found, placed at 1st place

后者是一個易於實現的遞歸表達式。

對於一對string, substr表示m=M(string, substr)最佳分數的子m=M(string, substr)相等

m * match + (len(substr) - m) * mismatch + (len(string)-len(substr)) * gap

它很簡單,在遞歸表達式中存儲最大值,以找出最匹配的是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM