'''
1. 詳細介紹一下各種排序算法,以及對應的時間複雜度。
冒泡排序(Bubble Sort)
基本思想:通過相鄰元素之間的比較和交換,使每一趟最大的元素能像氣泡一樣“浮”到數列的一端。
時間複雜度:
最優情況:O(n)
平均情況:O(n^2)
最壞情況:O(n^2)
空間複雜度:O(1)
選擇排序(Selection Sort)
基本思想:首先在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然後再從剩餘未排序元素中繼續尋找最小(或最大)元素,然後放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。
時間複雜度:
最優情況:O(n^2)
平均情況:O(n^2)
最壞情況:O(n^2)
空間複雜度:O(1)
插入排序(Insertion Sort)
基本思想:通過構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
時間複雜度:
最優情況:O(n)
平均情況:O(n^2)
最壞情況:O(n^2)
空間複雜度:O(1)
希爾排序(Shell Sort)
基本思想:先將整個待排序的記錄序列分割成爲若干子序列(由相隔某個“增量”的記錄組成)分別進行直接插入排序,然後依次縮減增量再進行排序,待整個序列中的記錄“基本有序”時,再對全體記錄進行一次直接插入排序。
時間複雜度:依賴於增量序列的選擇,但通常介於O(n)和O(n^2)之間。
空間複雜度:O(1)
歸併排序(Merge Sort)
基本思想:採用分治法的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。
時間複雜度:
最優情況:O(n log n)
平均情況:O(n log n)
最壞情況:O(n log n)
空間複雜度:O(n)(非原地排序)
快速排序(Quick Sort)
基本思想:通過一次排序將待排記錄分隔成獨立的兩部分,其中一部分記錄的關鍵字均比另一部分的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序。
時間複雜度:
最優情況:O(n log n)
平均情況:O(n log n)
最壞情況:O(n^2)(當輸入的數據已經有序時)
空間複雜度:O(log n)(遞歸棧空間)
堆排序(Heap Sort)
基本思想:將待排序的序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就爲最大值。然後將剩餘n-1個序列重新構造成一個堆,這樣會得到n個元素中的次大值。如此反覆執行,便能得到一個有序序列了。
時間複雜度:
最優情況:O(n log n)
平均情況:O(n log n)
最壞情況:O(n log n)
空間複雜度:O(1)
計數排序(Counting Sort)
基本思想:對於待排序的數組,如果最大值和最小值的差值不是太大,那麼可以通過申請一個計數數組,將輸入數據值轉化爲鍵存儲在計數數組中,然後輸出計數數組。
時間複雜度:
最優情況:O(n+k)(k是整數的範圍)
平均情況:O(n+k)
最壞情況:O(n+k)
空間複雜度:O(n+k)
2. 在RNA序列中,例如ACAGU,我們可以通過標記每個核苷酸爲 (、. 或 ) 來預測其二級結構。每對匹配的 () 必須是AU、GC或GU(或它們的鏡像對稱:UA、CG、UG)。我們還假設配對不能交叉。以下是ACAGU的有效結構:
ACAGU
.....
...()
..(.)
.(.).
(...)
((.))
在上面的例子中,最後一個結構是最優的(2對)。
>>> best("ACAGU")
(2, '((.))')
在RNA序列的二級結構預測中,如果存在多個最佳結構,可以任意選擇其中一個作爲結果,只要這個結構是正確的。這裏列出了一些其他的案例以及最佳結構的示例:
GCACG
(2, '().()')
UUCAGGA
(3, '(((.)))')
GUUAGAGUCU
(4, '(.()((.)))')
AUAACCUUAUAGGGCUCUG
(8, '.(((..)()()((()))))')
AACCGCUGUGUCAAGCCCAUCCUGCCUUGUU
(11, '(((.(..(.((.)((...().))()))))))')
GAUGCCGUGUAGUCCAAAGACUUCACCGUUGG
(14, '.()()(()(()())(((.((.)(.))()))))')
CAUCGGGGUCUGAGAUGGCCAUGAAGGGCACGUACUGUUU
(18, '(()())(((((.)))()(((())(.(.().()()))))))')
ACGGCCAGUAAAGGUCAUAUACGCGGAAUGACAGGUCUAUCUAC
(19, '.()(((.)(..))(((.()()(())))(((.)((())))))())')
AGGCAUCAAACCCUGCAUGGGAGCACCGCCACUGGCGAUUUUGGUA
(20, '.(()())...((((()()))((()(.()(((.)))()())))))()')
請寫出一個算法,語言不限。
'''
# acagu 中找:au, gc, gu, ua, cg, ug
# 從開始a找到匹配之後, 動態規劃, 組合等於現在的再加上 內部找, 或者右邊找.拼上.
def best(rna):
n = len(rna)
dp = [[0] * n for _ in range(n)] # str[i,j]中的最長匹配個數. 閉區間
brackets = [['.'] * n for _ in range(n)] # str[i,j]中最長匹配的解,閉區間.
for length in range(1, n): # length表示匹配的長度.#========這個必須對length做動態規劃.從而讓137行的代碼, 先把長度爲短的部分給算完.
for i in range(n - length): #i代表匹配的開始位置, j表示匹配的結束位置.
j = i + length
if (rna[i] == 'A' and rna[j] == 'U') or (rna[i] == 'U' and rna[j] == 'A') or (rna[i] == 'G' and rna[j] == 'C') or (rna[i] == 'C' and rna[j] == 'G') or (rna[i] == 'G' and rna[j] == 'U') or (rna[i] == 'U' and rna[j] == 'G'):
dp[i][j] = dp[i + 1][j - 1] + 1
brackets[i][j] = '('+brackets[i+1][j-1]+')' #字符串的i和j匹配成功.
for k in range(i, j): #用k來把i,j分割成2個部分.
if dp[i][j] < dp[i][k] + dp[k + 1][j]:#如果分割後有更長匹配,那麼更新表.
dp[i][j] = dp[i][k] + dp[k + 1][j]
brackets[i][j] = brackets[i][k] + brackets[k + 1][j]
return dp[0][n - 1], brackets[0][n - 1]
print(best('GCACG'))
print(best('UUCAGGA'))
print(best('GUUAGAGUCU'))
print(best('AUAACCUUAUAGGGCUCUG'))
print(best('AACCGCUGUGUCAAGCCCAUCCUGCCUUGUU'))
print(best('GAUGCCGUGUAGUCCAAAGACUUCACCGUUGG'))
print(best('CAUCGGGGUCUGAGAUGGCCAUGAAGGGCACGUACUGUUU'))
print(best('ACGGCCAGUAAAGGUCAUAUACGCGGAAUGACAGGUCUAUCUAC'))
print(best('AGGCAUCAAACCCUGCAUGGGAGCACCGCCACUGGCGAUUUUGGUA'))
'''
生物信息的題目
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.