补充资料链接:
每个字符串长度为23,只要前面的20个字符就行了,因为数据太大,我只传递了1的五分之一,有快速你可以粘贴代码,让兄弟读取它,谢谢!
这是正式的问题:
我现在有两个字符串数组,暂称为Candidates
和Bg_db
,它们都是长度为20的短字符串,每个字符串只包含以下四个字符:A,T,C ,G(对!基因组序列!):
Candidates = [
'GGGAGCAGGCAAGGACTCTG',
'GCTCGGGCTTGTCCACAGGA',
'...',
# Be you see, these fragments of human genes in fact
]
Bg_db = [
'CTGCTGACGGGTGACACCCA',
'AGGAACTGGTGCTTGATGGC',
'...',
# This more, there are about one billion
]
我的任务是每个候选人的候选人,找到记录中所有小于或等于Bg_db
4的差异,例如:
# The above one for the candidate, that is, a record candidates
# Intermediate | represent the same, * represent not the same
# The following represents a record of Bg_db
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
A T C G A T C G A T C G A T C G A T C G
* The difference is 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
* The difference is 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
* | | * | | | * | | | The difference is 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 G G A T C G A T C G
* | | * | | | * | |
T T C G T T C G A T C C A T C A A T C G
我的问题是,如果你很快发现:Bg_db
中的每个候选人的差异小于或等于所有记录中的4个,如果使用暴力遍历,则以Python为例:
def align (candidate, record_from_bg_db):
Mismatches = 0
For i in range (20):
If candidate [i]! = Record_from_bg_db [i]:
Mismatches + = 1
If mismatches> = 4:
Return False
Return True
Candidate = 'GGGAGCAGGCAAGGACTCTG'
Record_from_bg_db = 'CTGCTGACGGGTGACACCCA'
Align(candidate, record_from_bg_db) # 1.24 microseconds or so
# total time:
10000000 * 1000000000 * 1.24 / 1000/1000/60/60/24/365
# = 393
# 1 million candidates, 1 billion bg_db records
# Takes about 393 years
# Completely unbearable ah
我的想法是Bg_db
是一个高度有序的字符串(每个字符的长度可能只有四个),没有算法允许候选人快速比较所有Bg_db
,寻求建议。
答案 0 :(得分:2)
您在上面描述的内容正式称为汉明距离。你可以在这里阅读更多内容:
https://en.wikipedia.org/wiki/Hamming_distance
用以上链接中的开头陈述来解释:
在信息论中,两个弦之间的汉明距离 等长是相应的位置数 符号是不同的。换句话说,它测量最小数量 将一个字符串更改为另一个字符串所需的替换,或者 可能已将一个字符串转换为的最小错误数 另一个。
一种改进方法的简单方法是在观察>时退出字符串比较。 4个不匹配,但是当存在许多包含大量不匹配的字符串比较时,这只会减少运行时间。
您的另一个选择是使用更新的算法,例如那些实现Burrow-Wheeler变换(BWT)的算法。请在此处查看完整列表:
https://en.wikipedia.org/wiki/List_of_sequence_alignment_software#Short-read_sequence_alignment
使用BWT软件工具,我的建议是将其中一个序列数据集连接成一个目标序列,然后查询使用另一组短路序列。原因是当目标由少数大序列组成时,例如来自人类基因组的染色体,BWT算法通常可以正常工作。获得对齐后,您可以过滤掉那些跨越您加入目标序列的位置的对齐,即,跨越20个精确倍数的位置的对齐。
基于BWT的工具通常比过去的DNA序列比对算法快几个数量级,并且您提供的使用案例,即短序列的无空位对齐,是这些程序旨在优化的。
因此,除非这是一项家庭作业,否则我建议您研究哪种软件工具最适合您。开发自己的序列比对算法很困难(从个人经验来看),并且在正确评估现有工具上花费的时间将帮助您确定花费这些时间来开发软件是否值得。