生物信息的題目

''' 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')) '''
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章