Re: [問題] 由兩個DNA 資料庫搜索相同的DNA 序列

看板Perl作者 (goodday)時間10年前 (2015/01/21 16:52), 編輯推噓3(3013)
留言16則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《goodday06 (goodday)》之銘言: : 我有兩個DNA database: : database A 有約18 萬條序列,每條約500nt : database B 有約5 萬條序列,每條約5000nt : 我希望讓這A、B兩個database 互相比對, : 以找出A、B兩個database中,共有相同20nt 的兩筆序列。 : 我先用 "foreach" 將database A 每條序列分開, : 再用 "substr" 每20個nt 搜索 (DNA 的正反股都要搜索) : 再用 "foreach" 將database B 的序列逐一檢查跟 "substr" 相同者 : 結果... 我用小一點的database 測試並且估算, : 這樣用筆電算完,總共要四千天左右 XD : 想請教先進們 : 是否有節省時間的運算方式? : 或是換好一點的電腦會算比較快嗎? : 先謝不吝賜教!! 延續上一個問題 我已經依照L 大的意見將substr 製作成@DB_a, 要怎麼製作成 "%hash"? 抱歉我是perl新手 ^^" 十分感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.112.89.53 ※ 文章網址: https://www.ptt.cc/bbs/Perl/M.1421830351.A.8BE.html

01/21 21:18, , 1F
是把 substr 切割結果放到 %hash 裡,不是弄成 @DB_a
01/21 21:18, 1F

01/21 21:19, , 2F
建議你把完整程式碼跟輸入的資料直接貼到 GitHub Gist
01/21 21:19, 2F

01/21 21:19, , 3F
https://gist.github.com/ 方便更多其他板友也能回答
01/21 21:19, 3F

01/21 21:34, , 4F
這邊的概念是把 Perl 原生的 hash 型別來拿當作 set 用
01/21 21:34, 4F

01/21 21:36, , 5F
若存在一個 key 在某個 hash 容器中,key 肯定是唯一的
01/21 21:36, 5F

01/21 21:38, , 6F
舉例像 $hash{"ATCG"} = 1; 這就是字串 ATCG 當鍵值
01/21 21:38, 6F

01/21 21:40, , 7F
對應的資料可任意的指定,上述的例子是一個數字 1
01/21 21:40, 7F

01/21 21:42, , 8F
你在第一層迴圈時,我猜你會將輸入資料用 substr 切割
01/21 21:42, 8F

01/21 21:42, , 9F
因為你在第二層迴圈寫說要跟 substr 的結果做比較
01/21 21:42, 9F

01/21 21:43, , 10F
因此儲存到 %hash 的資料就會是那些 substr 的小片段
01/21 21:43, 10F

01/21 21:46, , 11F
由於 Perl 的 %hash 具備常數時間複雜度 O(1) 的能力
01/21 21:46, 11F

01/21 21:46, , 12F
在新增資料到 %hash 或者比較某個 key 是否在 %hash
01/21 21:46, 12F

01/21 21:48, , 13F
都是 O(1),進而使用"記憶體空間"來換取"CPU時間"
01/21 21:48, 13F

01/22 13:05, , 14F
參考L 大的方法 目前估計不用2hr 可以得到我要的資訊
01/22 13:05, 14F

01/22 13:05, , 15F
太感謝了!
01/22 13:05, 15F

01/22 20:03, , 16F
恭喜!不用 2 小時聽起來正常多了
01/22 20:03, 16F
文章代碼(AID): #1KlsZFY- (Perl)
文章代碼(AID): #1KlsZFY- (Perl)