话题 首页 > C++ 教程 > C++ 教程话题列表 > 详情

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

精华
LYUHE 2016-10-21 03:25:26 浏览(6031) 回复(5) 赞(0)
我现在有两个字符串数组,姑且称为candidates和bg_db,全部都是长度为20的短字符串,并且每个字符串的每个字符只有ATCG四种可能(没错!就是基因组序列啦!): ``` candidates = [ 'GGGAGCAGGCAAGGACTCTG', 'GCTCGGGCTTGTCCACAGGA', '...', # 被你看出来啦,这些其实人类基因的片段 ] bg_db = [ 'CTGCTGACGGGTGACACCCA', 'AGGAACTGGTGCTTGATGGC', '...', # 这个更多,有十亿左右 ] ``` 我的任务是对candidates的每一个candidate,找到bg_db中所有与其小于等于4个差异的记录,举个例子来说: ``` # 上面一条为candidate,即candidates的一个记录 # 中间|代表相同,代表不相同 # 下面一条代表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 ``` 我的问题是如果快速地找到:每一个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微秒左右 # 总时间: 10000000 1000000000 * 1.24 / 1000 / 1000 / 60 / 60 / 24 / 365 # = 393 # 1千万个candidates,10亿条bg_db记录 # 耗时大约393年 # 完全无法忍受啊 ``` 我的想法是,bg_db是高度有序的字符串(长度固定,每个字符的可能只有四种),有没有什么算法,可以让candidate快速比较完所有的bg_db,各位大神,求赐教。
cpp

回答(5)

宇文傻姑 2016-10-21

ACTG四种可能性相当于2bit,用一个字符表示一个基因位太过浪费了,一个字符8bit,可以放4个基因位。

即使不用任何算法,只是把你的20个基因写成二进制形式,也能节省5倍时间。

另外,循环20次,CPU的指令数是20*n条,n估计至少有3,但对于二进制来说,做比较的异或运算直接是cpu指令,指令数是1。

你的时间估算完全不对,这种大规模的数据量处理,好歹跑个几万条,持续十秒以上的时间,才能拿来做乘法算总时间,只算一条的话,这个时间几乎都是初始化进程的开销,而非关键的IO、CPU开销 。

一笔荒芜 2018-05-31

刚学习程序,过来学习学习!!!!...

1144100656 2018-05-31

有同样等问题咋解决,只能慢慢等大神啦.留名留名。。

1152696398 2018-05-31

快来解决啦!快来!快来! 快来 快来

要回复,请先登录 或者注册