App下載
話題 首頁(yè) > C++ 教程 > C++ 教程話題列表 > 詳情

如何提高大量的字符串比較速度?

精華
LYUHE 2016-10-21 03:25:26 瀏覽(5742) 回復(fù)(5) 贊(0)
我現(xiàn)在有兩個(gè)字符串?dāng)?shù)組,姑且稱為candidates和bg_db,全部都是長(zhǎng)度為20的短字符串,并且每個(gè)字符串的每個(gè)字符只有ATCG四種可能(沒(méi)錯(cuò)!就是基因組序列啦?。? ``` candidates = [ 'GGGAGCAGGCAAGGACTCTG', 'GCTCGGGCTTGTCCACAGGA', '...', # 被你看出來(lái)啦,這些其實(shí)人類基因的片段 ] bg_db = [ 'CTGCTGACGGGTGACACCCA', 'AGGAACTGGTGCTTGATGGC', '...', # 這個(gè)更多,有十億左右 ] ``` 我的任務(wù)是對(duì)candidates的每一個(gè)candidate,找到bg_db中所有與其小于等于4個(gè)差異的記錄,舉個(gè)例子來(lái)說(shuō): ``` # 上面一條為candidate,即candidates的一個(gè)記錄 # 中間|代表相同,代表不相同 # 下面一條代表bg_db的一條記錄 A T C G A T C G A T C G A T C G A T C G | | | | | | | | | | | | | | | | | | | | # 差異為0 A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G | | | | | | | | | | | | | | | | | | | # 差異為1 T T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G | | | | | | | | | | | | | | | | | | # 差異為2 T T C G T T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G A T C G | | | | | | | | | | | | | | | | | # 差異為3 T T C G T T C G A T C C A T C G A T C G A T C G A T C G A T C G A T C G A T C G | | | | | | | | | | | | | | | | # 差異為4 T T C G T T C G A T C C A T C A A T C G ``` 我的問(wèn)題是如果快速地找到:每一個(gè)candidate在bg_db中與之差異小于等于4的所有記錄,如果采用暴力遍歷的話,以Python為例: ``` def align(candidate, record_from_bg_db):mismatches = 0for i in range(20):if candidate[i] != record_from_bg_db[i]:mismatches += 1if mismatches >= 4:return Falsereturn True candidate = 'GGGAGCAGGCAAGGACTCTG'record_from_bg_db = 'CTGCTGACGGGTGACACCCA' align(candidate, record_from_bg_db) # 1.24微秒左右 # 總時(shí)間: 10000000 1000000000 * 1.24 / 1000 / 1000 / 60 / 60 / 24 / 365 # = 393 # 1千萬(wàn)個(gè)candidates,10億條bg_db記錄 # 耗時(shí)大約393年 # 完全無(wú)法忍受啊 ``` 我的想法是,bg_db是高度有序的字符串(長(zhǎng)度固定,每個(gè)字符的可能只有四種),有沒(méi)有什么算法,可以讓candidate快速比較完所有的bg_db,各位大神,求賜教。
cpp

回答(5)

宇文傻姑 2016-10-21

ACTG四種可能性相當(dāng)于2bit,用一個(gè)字符表示一個(gè)基因位太過(guò)浪費(fèi)了,一個(gè)字符8bit,可以放4個(gè)基因位。

即使不用任何算法,只是把你的20個(gè)基因?qū)懗啥M(jìn)制形式,也能節(jié)省5倍時(shí)間。

另外,循環(huán)20次,CPU的指令數(shù)是20*n條,n估計(jì)至少有3,但對(duì)于二進(jìn)制來(lái)說(shuō),做比較的異或運(yùn)算直接是cpu指令,指令數(shù)是1。

你的時(shí)間估算完全不對(duì),這種大規(guī)模的數(shù)據(jù)量處理,好歹跑個(gè)幾萬(wàn)條,持續(xù)十秒以上的時(shí)間,才能拿來(lái)做乘法算總時(shí)間,只算一條的話,這個(gè)時(shí)間幾乎都是初始化進(jìn)程的開(kāi)銷,而非關(guān)鍵的IO、CPU開(kāi)銷 。

一筆荒蕪 2018-05-31

剛學(xué)習(xí)程序,過(guò)來(lái)學(xué)習(xí)學(xué)習(xí)!!!!...

1144100656 2018-05-31

有同樣等問(wèn)題咋解決,只能慢慢等大神啦.留名留名。。

1152696398 2018-05-31

快來(lái)解決啦!快來(lái)!快來(lái)! 快來(lái) 快來(lái)

要回復(fù),請(qǐng)先登錄 或者注冊(cè)