免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6984 | 回复: 24
打印 上一主题 下一主题

python DNA序列匹配问题求算法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-08-30 12:10 |只看该作者 |倒序浏览
有一个DNA序列,ACGUAGCU,A和U,C和G匹配,但是中间不能有交叉,比如第二位C和第六位G不能匹配,因为他俩要是匹配,第三位G必定只能跟第七位C匹配,这样的话就有交叉。所以这个序列只有两种匹配方式,第一位A和第四位U,第二位C和第三位G,第五位A和第八位U,第六位G和第七位C。或者第一位A和第八位U,第四位U和第五位A,第二位C和第三位G,第六位G和第七位C匹配。求有多少种匹配的可能,序列有300bp,希望运行时间不要太长。求大神算法。

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
2 [报告]
发表于 2015-08-31 13:35 |只看该作者
本帖最后由 icymirror 于 2015-09-01 12:22 编辑

回复 1# anna_bi
思路大体如下:
0. 读入一个基因进入等待匹配序列
1. 读入一个基因字符,(成功读取,进行后续判断,失败读取--假设为到总串尾部,整理并输入之前的匹配串。)
2. 分两支进行匹配检测:
    1). 进行后向匹配(和当前基因字符之前进入序列的字符进行匹配)
        如果匹配,在等等匹配的字符序列中移除被匹配的字符,进入序列完成检测
              如果匹配的结果使得剩余的待匹配序列长度变为0,那么,记录此子序列的开始和结束位置,从下个基因字符开始新的子序列匹配过程(分布式或者并行运算时,这里可以分支出新的进程作子序列匹配),并且重复匹配过程
        如果不匹配,把当前字符也放入到等待匹配序列里面去。
        跳转到步骤1开始循环。
    2). 进行前向匹配(就是和后面要读进来的字符进行匹配)
        如果匹配,读取位置跳过下一基因字符
                如果无法读取,说明到文件尾,
        如果不匹配,把当前字符也放入到等待匹配序列里面去。
        跳转到步骤1开始循环。

问题是:这个算法需要的太多的空间(线程、存储),不太合适单机跑--当数据量太大时。

评分

参与人数 1信誉积分 +10 收起 理由
substr函数 + 10 很给力!

查看全部评分

论坛徽章:
12
射手座
日期:2014-10-02 11:31:29程序设计版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-27 06:20:00程序设计版块每日发帖之星
日期:2016-05-25 06:20:00每日论坛发贴之星
日期:2016-05-24 06:20:00程序设计版块每日发帖之星
日期:2016-05-24 06:20:0015-16赛季CBA联赛之深圳
日期:2016-05-23 15:33:59程序设计版块每日发帖之星
日期:2016-05-20 06:20:00程序设计版块每日发帖之星
日期:2016-04-26 06:20:00神斗士
日期:2015-12-03 09:27:3215-16赛季CBA联赛之八一
日期:2016-12-29 09:56:05
3 [报告]
发表于 2015-08-31 14:51 |只看该作者
数据量太大是问题

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
4 [报告]
发表于 2015-08-31 16:13 |只看该作者
本帖最后由 substr函数 于 2015-08-31 16:18 编辑

LZ我有2个问题。
问题1:
dna 序列
len(dna) 是多少?

问题2:
这对马?

dan = ACGUAGCU
[AU|UA] [GC|CG]

[ [ 1, 4 ], [ 5, 8 ] ]        [ [ 2, 3 ], [ 6, 7 ] ]
[ [ 1, 8 ], [ 4, 5 ] ]        [ [ 2, 3 ], [ 6, 7 ] ]

COUNT = 2

dna = ACGUAGCUACGUAGCU
[AU|UA] [GC|CG]

[ [ 1, 4 ], [ 5, 8 ], [ 9, 12 ], [ 13, 16 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 4 ], [ 5, 8 ], [ 9, 16 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 4 ], [ 5, 12 ], [ 8, 9 ], [ 13, 16 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 4 ], [ 5, 16 ], [ 8, 9 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 4 ], [ 5, 16 ], [ 9, 12 ], [ 8, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 4 ], [ 5, 16 ], [ 8, 9 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 15 ], [ 10, 11 ], [ 7, 14 ] ]
[ [ 1, 4 ], [ 5, 16 ], [ 9, 12 ], [ 8, 13 ] ]        [ [ 2, 3 ], [ 6, 15 ], [ 10, 11 ], [ 7, 14 ] ]
[ [ 1, 8 ], [ 4, 5 ], [ 9, 12 ], [ 13, 16 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 8 ], [ 4, 5 ], [ 9, 16 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 12 ], [ 4, 5 ], [ 8, 9 ], [ 13, 16 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 12 ], [ 5, 8 ], [ 4, 9 ], [ 13, 16 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 12 ], [ 4, 5 ], [ 8, 9 ], [ 13, 16 ] ]        [ [ 3, 10 ], [ 6, 7 ], [ 2, 11 ], [ 14, 15 ] ]
[ [ 1, 12 ], [ 5, 8 ], [ 4, 9 ], [ 13, 16 ] ]        [ [ 3, 10 ], [ 6, 7 ], [ 2, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 4, 5 ], [ 8, 9 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 4, 5 ], [ 9, 12 ], [ 8, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 4, 5 ], [ 8, 9 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 15 ], [ 10, 11 ], [ 7, 14 ] ]
[ [ 1, 16 ], [ 4, 5 ], [ 9, 12 ], [ 8, 13 ] ]        [ [ 2, 3 ], [ 6, 15 ], [ 10, 11 ], [ 7, 14 ] ]
[ [ 1, 16 ], [ 5, 8 ], [ 4, 9 ], [ 12, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 5, 8 ], [ 9, 12 ], [ 4, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 5, 12 ], [ 8, 9 ], [ 4, 13 ] ]        [ [ 2, 3 ], [ 6, 7 ], [ 10, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 4, 5 ], [ 8, 9 ], [ 12, 13 ] ]        [ [ 3, 10 ], [ 6, 7 ], [ 2, 11 ], [ 14, 15 ] ]
[ [ 1, 16 ], [ 5, 8 ], [ 4, 9 ], [ 12, 13 ] ]        [ [ 3, 10 ], [ 6, 7 ], [ 2, 11 ], [ 14, 15 ] ]

COUNT = 22

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
5 [报告]
发表于 2015-08-31 16:42 |只看该作者
回复 2# icymirror


大神。
有没有代码?
学习学习?

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
6 [报告]
发表于 2015-09-01 09:05 |只看该作者
本帖最后由 icymirror 于 2015-09-01 09:06 编辑

回复 4# substr函数
对于问题一,楼主的原贴里面写了,是:300bp (估计应当是300pb=300*1024 Tb = 300 * 1024 * 1024 Mb, 数据量还是相当大的。)

论坛徽章:
26
2015亚冠之胡齐斯坦钢铁
日期:2015-06-25 21:40:202015亚冠之柏斯波利斯
日期:2015-08-31 17:03:192015亚冠之柏斯波利斯
日期:2015-11-07 13:10:00程序设计版块每日发帖之星
日期:2015-11-10 06:20:00每日论坛发贴之星
日期:2015-11-10 06:20:00程序设计版块每日发帖之星
日期:2015-11-26 06:20:00程序设计版块每日发帖之星
日期:2015-12-02 06:20:00黄金圣斗士
日期:2015-12-07 17:57:4615-16赛季CBA联赛之天津
日期:2015-12-23 18:34:14程序设计版块每日发帖之星
日期:2016-01-02 06:20:00程序设计版块每日发帖之星
日期:2016-01-06 06:20:00每日论坛发贴之星
日期:2016-01-06 06:20:00
7 [报告]
发表于 2015-09-01 12:37 |只看该作者
回复 6# icymirror


谢谢大神

假设是长度 100 好了
len(dna) = 100

我想学习学习大神的代码

论坛徽章:
0
8 [报告]
发表于 2015-09-02 08:58 |只看该作者
回复 4# substr函数
是这样的啊


   

论坛徽章:
0
9 [报告]
发表于 2015-09-02 10:38 |只看该作者
回复 2# icymirror
大神可不可以写下代码?


   

论坛徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白银圣斗士
日期:2015-11-17 15:13:0815-16赛季CBA联赛之新疆
日期:2016-04-01 09:10:58
10 [报告]
发表于 2015-09-02 11:02 |只看该作者
少量数据的代码如下:
  1. total_patterns = 0

  2. def is_match(item, to_check):
  3.     available_pairs = (('A', 'U'), ('U', 'A'), ('G', 'C'), ('C', 'G'))
  4.     return (item, to_check) in available_pairs

  5. def search_pattern(series, start, current, unmatched, tabs=0):
  6.     if is_match(series[current], unmatched[-1]) == True:
  7.         if current == len(series) - 1:
  8.             if len(unmatched[:-1]) == 0:
  9.                 # print "Pattern: " + "--" * tabs + "start-{0}, end-{1}".format(start, current)
  10.                 # print "Found SUCCESSFUL match!\n"
  11.                 global total_patterns
  12.                 total_patterns = total_patterns + 1
  13.             else:
  14.                 # print "Railed reach end!\n"
  15.                 pass
  16.         else:
  17.             if len(unmatched[:-1]) == 0:
  18.                 # print "Pattern: " + "--" * tabs + "start-{0}, end-{1}".format(start, current)
  19.                 search_pattern(series, current + 1, current + 2, series[current + 1], tabs + 1)
  20.             else:
  21.                 search_pattern(series, start, current + 1, unmatched[:-1], tabs)

  22.     if current == len(series) - 1:
  23.         return
  24.     if is_match(series[current], series[current + 1]) == True:
  25.         current = current + 2
  26.         search_pattern(series, start, current, unmatched, tabs)
  27.     else:
  28.         unmatched = unmatched + series[current]
  29.         current = current + 1
  30.         search_pattern(series, start, current + 1, unmatched, tabs)

  31. def main():
  32.     dna_serie = "ACGUAGCUACGUAGCU"
  33.     search_pattern(dna_serie, 0, 1, dna_serie[0])
  34.     print "Found {0} types of successful split.".format(total_patterns)

  35. if __name__ == '__main__':
  36.     main()
复制代码
可以把注释用的"#"号去除,去查看下匹配的各个子串的起始和结束位置。
但是这个代码只适用于少量数据的情况下。
大量数据的情况下,代码就不一样了。
很多的过程要再分拆。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP