我现在有两个字符串数组,姑且称为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,各位大神,求赐教。