设为首页收藏本站

爱吱声

 找回密码
 注册
搜索
查看: 10281|回复: 27
打印 上一主题 下一主题

[科技前沿] 字符串匹配

[复制链接]

该用户从未签到

跳转到指定楼层
楼主
发表于 2013-10-7 04:13:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 橡树村 于 2013-10-15 15:48 编辑 # f9 ]+ E  R. Q) K  O
0 ^4 ?6 G/ l0 n5 O
字符串匹配,string match,这个是计算机里面常见的问题,例如:
/ l  f* x2 g( v3 J, V- t( }) c$ W5 E, @' h- i- @# A# P
string1: TACGGCATGGCTATCGTAGCTAG- g- ]  i3 i- q9 x& `
7 T6 t' e- y& L( r; k. |
string2: GCTAT( p& q6 e( ~# W9 s' R7 b

- b$ _6 z; T, M$ Y: G. g要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
: D* \8 @. e$ c3 Q0 x2 G0 A, c- F9 N% J2 n3 a& |( v
可以自己估计一下时间复杂度,真实的例子是,String1长达3billion,或者6个billion。string2长约一、二百,但是数目可以是以billion计的。1 o  w# a# o: `: T3 n  F! t6 ~" V

7 Y: h8 |+ W' q" F6 S: V先扛着。

该用户从未签到

沙发
发表于 2013-10-7 05:16:35 | 只看该作者
怎么感觉这个和基因研究有关?识别基因里的某种特征?

点评

这个不只是和基因有关。  发表于 2013-10-7 10:39
  • TA的每日心情
    开心
    2023-3-1 00:08
  • 签到天数: 2397 天

    [LV.Master]无

    板凳
    发表于 2013-10-7 06:17:53 | 只看该作者
    晨枫 发表于 2013-10-6 16:16 : L1 z: ?9 V* A
    怎么感觉这个和基因研究有关?识别基因里的某种特征?
    * M5 B& h; g" q2 @0 M8 P- s: m
    这就是基因BLAST算法的标准定义嘛。。。" m1 \5 G6 A1 T- h4 e; n, R
    ; _* @, f* y' p' `# }! v4 |* a" ~2 h" w
    Google "Blast算法",一堆开源程序。
    % x) z0 P: B0 P/ I, C  r" }

    点评

    呵呵,这只是blast要解决的问题,而非定义。事实上,blast很少使用,因为首贴里的实际问题,用blast在可以容忍的时间里是完不成的,你可以估算一...  发表于 2013-10-7 08:55

    该用户从未签到

    地板
    发表于 2013-10-7 07:21:39 | 只看该作者
    MacArthur 发表于 2013-10-6 16:17
      G/ V8 a2 \4 o/ E( l6 f这就是基因BLAST算法的标准定义嘛。。。
    7 T! C; Y, n; p: f! a+ E- s) X3 g# D) f2 E. O
    Google "Blast算法",一堆开源程序。

    , ^- w; t: p. ]* u" S& O7 h莫非麦帅也是干这一行的?不然怎么会这么熟悉?

    点评

    麦帅好职业  发表于 2013-10-7 20:51
    Work with bioinformatician  发表于 2013-10-7 11:31

    该用户从未签到

    5#
    发表于 2013-10-7 07:28:07 | 只看该作者
    晨枫 发表于 2013-10-7 07:21
    4 k5 x4 R( m* j% ^2 a& B莫非麦帅也是干这一行的?不然怎么会这么熟悉?

    * v( Z% C2 G+ {2 ^9 y0 g这都不用动手写吧?正则表达式很多语言都支持啊

    点评

    这世界上很多东西,用就好了。  发表于 2013-10-7 10:37

    该用户从未签到

    6#
    发表于 2013-10-7 07:29:33 | 只看该作者
    假如十八 发表于 2013-10-6 17:28 1 J/ r1 m1 u6 E# A- b
    这都不用动手写吧?正则表达式很多语言都支持啊

    & t: _, I! o3 U$ [9 o& s- S) J有可能是普通的bubble sort和quick sort之间的差别?也就是说,普通算法的效率不适合特别大的海量比较计算?

    点评

    往下看,有点儿意思。  发表于 2013-10-7 10:37
  • TA的每日心情
    擦汗
    2019-6-16 23:34
  • 签到天数: 1277 天

    [LV.10]大乘

    7#
    发表于 2013-10-7 07:33:11 | 只看该作者
    老兵有个群组,软件人家。

    点评

    谢谢提醒,有机会看看。  发表于 2013-10-7 08:57
  • TA的每日心情
    开心
    2016-4-24 12:49
  • 签到天数: 7 天

    [LV.3]辟谷

    8#
    发表于 2013-10-7 08:38:30 | 只看该作者
    MacArthur 发表于 2013-10-7 06:17 ( d3 u  B9 W& I8 P
    这就是基因BLAST算法的标准定义嘛。。。8 C  u7 n/ a# `7 x2 J8 ^3 b
    ! f/ J+ c: q8 {/ Q! j
    Google "Blast算法",一堆开源程序。
    & K$ m3 Y) x! U
    blast......恍若隔世,你不说我都忘了曾经有那么一段时间天天跟这个较劲。。。。

    点评

    对葵花开始滔滔江水。。。  发表于 2013-10-7 11:36
    是吗?做什么呢?  发表于 2013-10-7 10:36

    该用户从未签到

    9#
     楼主| 发表于 2013-10-7 09:01:33 | 只看该作者
    最野蛮也是最简单的办法:一个一个比。
    * I  M* V2 i7 A8 i. z, u
    ; S! y2 {1 h, l& b; i
    string1: TACGGCATGGCTATCGTAGCTAG
    9 ~  E+ m. N% ?8 F; j, L" @$ M$ ^
    % Q1 l( X" t# h4 l. P4 _( fstring2: GCTAT! I# T! c( ?0 g, o# p" M1 v
    $ h7 Q6 w, R2 D. J& e2 N0 a/ s) _8 a
    要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
    0 A: x& \: T  r$ P* m/ @2 ]

    3 e! s8 Q- T( I拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
    ; ?# Z/ u) x# _4 t" C9 d4 P' k. C# I! Y' t) Y! h2 `
    但是如果实际情况中,有10^6到10^9个string2s,那总共要比多少次?10^15到10^18次。这什么概念?不考虑所有的overhead,比一次只需一个时钟,那3G的CPU,意味着一秒可以比10^9次,要完成这样一个工作,需要10^6到10^9秒,1年=365天 x 24小时 x 3600秒=31Millon秒。也就是说,最短大约需要12天,最长需要30年。如果这样的操作做十次,一台CPU要算至少120天到300年!!!人都死几次还没比完,太郁闷了,所以不可接受。
    " h4 P6 p# n% U% A1 o: J
    3 G! {" b! A, o: T0 U% m6 E8 F) q那如果是这个样子
    ( r& U6 s! Y7 D+ x  `0 b/ s& E) a% R5 R/ r  s8 }6 o; D
    string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
    - ?5 U0 ?0 L9 G' U6 ]9 P* K4 }string2: TTAAA; ]# `7 U1 C$ C' U* l$ r( d" g0 @
    4 I$ u# Y  f5 B3 N& Q% Y
    是不是会快很多?% V4 y! X+ a7 }9 D

    ! _+ n# e" s2 `/ {# Z% ^( o继续扛。
  • TA的每日心情
    开心
    2025-9-3 17:48
  • 签到天数: 595 天

    [LV.9]渡劫

    10#
    发表于 2013-10-7 09:47:11 | 只看该作者
    喜欢喝冰茶 发表于 2013-10-7 09:01 & {1 T; q. W; I; |& B
    最野蛮也是最简单的办法:一个一个比。

    7 w7 f2 A  x% f) Z+ R  Y4 @! t5 b帮你顶一下。很多问题,看起来很简单,但是在数据量大的情况下,根本不是那么回事。
    * K0 h5 ]+ K" V5 b- x7 y这可以产生很多计算机专家。7 {4 }: h7 ^2 X: `- v5 A
    对于算法的问题,一般我都躲着。

    点评

    是,一旦数据量很大的时候,计算压力有时是不可容忍的,要不怎么热炒BigData呢。  发表于 2013-10-7 10:36

    该用户从未签到

    11#
     楼主| 发表于 2013-10-7 10:35:44 | 只看该作者
    本帖最后由 喜欢喝冰茶 于 2013-10-6 20:40 编辑 * S- G6 o* M. m& U
    如果两个字符串是这个样子" M" P3 a, G+ L2 {- [

    - _& ?( b$ I0 T3 n& \$ ^+ m; Ustring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
    ) @/ ~2 Y1 F2 T) V0 Jstring2: TTAAA

    / Y- p  Z- s5 C! _" x. x: k3 d. ]& ]
    9 Q  x0 T, ~: F当然要省很多时间,因为不需要对string1一个一个比了!!!
    + H: ~- I- C- G" H7 ^* Z1 E1 c) ]) v8 P% ]" \2 z, j
    string1可以写成:
      E8 @4 ], Q8 W- s长度 字符 起始位置  q4 i" m; [) H" q- b
    6      A     1
    % i) w2 s( `: w5 O: o9 Y6 b4      T     7. r& h) B$ C0 s; H$ D% N
    5      C     11
    ( j$ l5 s. |+ g+ l3 R* p& T3      G     16
    , ]( l: s: K" Q  z7 F4      T     19
    / R7 V4 k. x; p! ?+ P3 C......0 H" ]* S) F$ P* _9 b% L
    ' h; T  p2 r; k6 w3 t  [2 R% J
    所以当用string2去比的时候,一开始根本就不用考虑字符为A,G,C的行,因为string2开始是T。因此在这个例子中,不需要去检查string1的每个位置,而是非常有限的几个位置,所以可以省很多时间。
    1 e: S) P) @% {& g
    : z- h+ A4 j6 i# B3 D( Y+ G8 @那么如果存在一种这样的转换方法能够将主贴里的字符串转化成这种,势必会省很多时间。有这样一种方法吗?哪里去找?
    . r1 J7 B. g2 A& Y9 j( q, X) ]/ W0 C* ~6 c: U! c* H" Z4 I
    如果你是有心人,你觉得这个东西最常用在哪里?
    ( t8 r/ i- z* A- h0 n6 ~
    " a! p* a! j. l% V7 t+ j2 a0 U对了,文件压缩。
    + d( h% R0 T8 x! {& w  Y9 z6 X- d6 T- K2 D: Z! J% A) G
    事实上,真正的解决方法就是借鉴了最早用于文件压缩的一种算法,称为Burrows-Wheeler Transform,又称block-sorting compression。这是当年在DEC工作的Michael Burrows和David Wheeler发明的,所以以他们的名字命名,bzip2的压缩文件就是基于该算法的。它的转换其实很简单,如果感兴趣大家可以google/wiki(wikipedia上很详细的操作细节)上去看细节,但简单的来说,就是把一个字符串头围相接,不停的移动一位,然后排序,最后取出最后一列就行了。Burrows-Wheeler Transform的特性就是转换后的字符串相对于原始字符串含有大量的重复字符片段,所以就可以使得我们的问题变的相对快捷。
    2 S0 o" z' X: {' c7 g, D7 L  r2 E$ ~
    + J" _5 W; M0 S! a那么是否就十全十美,万事大吉了呢?这个需要从实际的具体需求来看。/ P5 D+ X+ U" I. d- }

    6 p, g7 F4 `3 z, Y扛吧,没什么好说的。' r/ @5 l" B- t

    " s) r: F( q& c* d; |

    该用户从未签到

    12#
     楼主| 发表于 2013-10-7 10:38:50 | 只看该作者
    MacArthur 发表于 2013-10-6 16:17
    ! t" X( N+ C0 l. @) @# q6 j这就是基因BLAST算法的标准定义嘛。。。6 G1 U3 W1 B- u& g  X) M1 O

    & t+ s5 O4 ~4 kGoogle "Blast算法",一堆开源程序。
    * N9 W0 ~% a# }9 I
    blast并非只是解决基因的问题,蛋白同样适用,只不过相对于DNA/RNA而言,蛋白质要复杂得多。
  • TA的每日心情
    开心
    2023-3-1 00:08
  • 签到天数: 2397 天

    [LV.Master]无

    13#
    发表于 2013-10-7 11:35:18 | 只看该作者
    喜欢喝冰茶 发表于 2013-10-6 21:38 # i( c- i: z; `
    blast并非只是解决基因的问题,蛋白同样适用,只不过相对于DNA/RNA而言,蛋白质要复杂得多。 ...

    6 J$ j; G0 t0 w3 [/ }7 e: N不明觉厉。。。 上Billion字节的操作,想想就头大。。。 这个规模是不是得上并行计算了?- H$ F( Q& d4 M: w, l$ ^# ^

    该用户从未签到

    14#
     楼主| 发表于 2013-10-7 11:45:36 | 只看该作者
    MacArthur 发表于 2013-10-6 21:35
    " a, G& e$ z# ?+ D' Z4 V1 ~5 l, P不明觉厉。。。 上Billion字节的操作,想想就头大。。。 这个规模是不是得上并行计算了?9 _4 k) a- }; V$ Y
    ...
    7 K( E3 o5 h3 D5 t5 }
    blast好像支持吧,主要不是分布式的问题,而是blast使用的算法对蛋白的分数的定义是很有讲究的,这些分数的定义大概要涉及到另外一个和进化相关的计算领域。
  • TA的每日心情
    奋斗
    2017-3-1 00:54
  • 签到天数: 286 天

    [LV.8]合体

    15#
    发表于 2013-10-7 11:47:04 | 只看该作者
    本帖最后由 老芒 于 2013-10-8 00:21 编辑
    : y0 s0 D7 S& O2 a# P) A
    : Y% M5 @( d" R4 M( y这样的短贴适合聊天版。

    点评

    这个内容还是很有深度的。  发表于 2013-10-8 00:15
    不明觉厉?什么意思?这能跟paper比吗?只不过为了照顾没基础的同学们了解罢了,例如住院医生。  发表于 2013-10-7 15:13
    不明觉厉,但是爱坛不是论文发布地。  发表于 2013-10-7 12:08
    您觉得这个东西很简单?呵呵,最早应用这种方法的文章,已经几乎3千次的引用,虽然是09年发的,另外一篇也有2500次的引用,不乏Science,Nature上的  发表于 2013-10-7 11:58
  • TA的每日心情
    开心
    2025-3-30 11:48
  • 签到天数: 1064 天

    [LV.10]大乘

    16#
    发表于 2013-10-7 12:27:10 | 只看该作者
    喜欢喝冰茶 发表于 2013-10-7 10:35
    3 Y2 l8 M, c% F1 m/ k0 l* k6 h7 O7 _当然要省很多时间,因为不需要对string1一个一个比了!!!
    3 Z7 @7 ^- p; O/ W7 B  u4 |/ L/ U: \( E" X, R
    string1可以写成:

    7 H4 E/ i5 ^' V5 t" z是要找pattern! `  U$ y8 W, A2 H
    3 u. i. Z: U' U- S+ l) I" P
    Ensembl就用了这种数据压缩方法,
    8 E' r7 g5 v! M9 mAAATTCCGG1 }- o5 n5 ^; \5 W
    A3T2C2G2! b2 L+ m$ N% g! r% v9 d2 {0 S
    9 K, y7 S! m" z/ o+ ^3 S
    把string1,分成若干片段,多进程查找。

    点评

    呵呵,你这可是托?BWT based的方法是NGS能够大规模应用的基础,也是以后可以做personalize medicine一个很重要的前提,特别是癌症。基于它的程序太有名了  发表于 2013-10-7 15:17

    该用户从未签到

    17#
     楼主| 发表于 2013-10-7 21:57:48 | 只看该作者
    本帖最后由 喜欢喝冰茶 于 2013-10-7 12:05 编辑 & d5 _3 N* }6 Z  R5 |! M4 j. E8 X
    . |! y3 Q4 o1 m6 Z' I7 F7 s
    已经有同校指出了blast,一个用于对生物大分子的测序程序。这东西正式诞生于1990年,同年人类基因组计划启动。它不仅可以用于DNA/RNA的测序,还可以对蛋白测序。六年前在河里曾经写过一个搭积木的小玩意儿,其中涉及到利用计算方法来预测实验中很难测量的蛋白质空间结构,最有效的计算方法就是同源模型。在这个模型里面,我们允许寻找的字符串,string2可以不用严格的和string1,也就是模板序列,匹配的。换句话说,就是字符串匹配是容错的。具体到主贴里提到的真实问题的挑战,就是模板字符串是人类的基因组(genome),单链长达3billion结构单位,也就是3billion的字符长度,而DNA是双链的,也就是6B的长度。想一想,每个人都是unique的,所以即使都是“健康人”,每个人的基因组都不会完全一样,因此,这种字符串的匹配一定是允许错误的,否则的话,如果大家都一样,即使算法速度再慢都不是问题,因为只做一次,从时间复杂度上,就是0。/ T$ k+ K; [- [" W% |, `

    ! s# X( f6 h& ^2 m# C那么如果考虑容错的匹配,基于bwt方法的算法将面临一个巨大的挑战,因为BWT是严格转换的,可是容错的实际需要,就要考虑转换前和转换后的字符串的错误问题,这会使的问题非常复杂。因此,现在的解决方案就是,当我们需要更多的关注容错的问题时,我们仍然使用传统的,也就是blast所使用的Smith-Waterman算法。具体的细节,感兴趣的可以google/wiki,基本来讲,这是一种被称之为动态编程的计算机算法,可以很好的考虑容错问题,诸如substitution、insertion、deletion或者indel(也就是insertion和deletion的混合体),而这些“错误”,则广泛的存在于病人的基因组中,特别是癌症基因组。当然,现在所使用的smith-waterman基于的方法都是修改了的,主要是计算机算法上的加速,诸如hash的SW算法。
    ' T4 M3 B3 G5 H, Z- @  `% D9 @7 K! n+ m; I  ?
    但是,bwt基于的方法,运算速度非常快。曾经有朋友几年前做过测试,拿上一代mac book pro,对于5万个长达100字符的输入string2s,string1是人类第一号染色体的DNA序列。blast要跑a couple of minutes,但是第一代bwt based的应用程序,在用手捋了一下头发之后,结果就出来了,当时朋友还以为自己错了。所以相对于blast所使用的算法而言,以bwt为基础的应用,诸如bowtie/bowtie2,bwa(short read version),soap(主要运行于HPC上,由位于深圳的华大基因开发,他们大概是曙光的最大用户),这些闻名遐迩的应用程序(从文章引用次数上,bowtie是最早的,发表于2009年,引用数已经接近3千,bwa大约2千五,soap约为700。引用它们的文章,不仅包括Nature,Science,Cell还有医学领域里的一些著名杂志,像新英格兰医学杂志),使得新型测量技术得以广泛的应用。如果不考虑监管、法律和伦理方面的问题,在可以预见的将来,你的mobile device里存储自己的DNA序列将不再是梦想而是现实,而人们同时希望,DNA序列的检测成为新生儿的常规检查。

    该用户从未签到

    18#
     楼主| 发表于 2013-10-9 10:43:40 | 只看该作者
    本帖最后由 喜欢喝冰茶 于 2013-10-10 15:20 编辑 $ c% {" X7 I4 Q5 T; b8 C1 ~; @7 s9 Y/ V

    " K8 A. f. F+ j* Q" K2 O+ {这个帖子里的东西,看起来似乎是一个简单的计算问题,但是却很可能是一场改变人类健康革命的基础。正是由于高速有效的匹配算法的发展,才使得新的测序技术得以广泛应用,不仅是基础研究,而更重要的是临床应用,这里简单的提到一些。等有空的时候,写一些有关基于genome和tanscriptome的技术以及实际应用,像分子诊断技术,这将对癌症的诊断和预期提供巨大的帮助。感兴趣的同学,可以看看AML,也就是急性骨髓性白血病的亚型分类标准,特别是WHO的新标准,还有预期,是否能看懂。' S4 e( J* r4 v2 l

    该用户从未签到

    19#
    发表于 2013-10-11 12:06:48 | 只看该作者
    喜欢喝冰茶 发表于 2013-10-9 10:43 * \- j6 L: p7 X! O3 c! j7 o
    这个帖子里的东西,看起来似乎是一个简单的计算问题,但是却很可能是一场改变人类健康革命的基础。正是由于 ...

      Q, M1 E4 D( Z. F欢迎欢迎。
    " H" q) L" z2 F, t: K6 f2 D5 d' R2 C% f
    如果说硬要分类,这个应该还是属于生物信息学领域吧,在科教学圃应该很对口啊。% Z+ `3 Y$ ]! P- \$ s3 ^

    " ^1 o& z7 ^8 U$ X  u  l9 H) m使用NCBI网站上的BLAST都是10多年前的事情了,一眨眼人都老了。。。
    3 ^, G+ r& @8 g0 a! ]0 l
    ) j: s( s2 _/ ~: G6 D$ }, g2 J关于你下面会介绍的内容,非常期待。很久没有学习这方面的知识了,落伍了,亟待补课
    9 t" w( o0 }: H$ y4 N* l( C% B( ^* K3 ?# O: J" m) k8 M

    该用户从未签到

    20#
     楼主| 发表于 2013-10-11 23:06:06 | 只看该作者
    chalet 发表于 2013-10-10 22:06
    ( x* a& `2 `3 q' Q* y6 d  s4 F欢迎欢迎。
    ( c4 _; e4 m2 O" Y; n/ ?+ L3 X
    , _5 Q9 }+ P+ q' Q7 Q+ a如果说硬要分类,这个应该还是属于生物信息学领域吧,在科教学圃应该很对口啊。

    6 t0 K$ \7 l; o9 h" ^握握手,看起来也是生物计算的啊,现在在做什么?2 }- `( h) \  U6 D. H: E3 l( ~
    2 L' q& w2 \; g# {4 n- B
    还没想好怎么写,涉及的范围得控制一下,要不太大了,而且需要用些篇幅介绍一下疾病得复杂性,像癌症,这个得加好多分子遗传方面的科普,否则的话会很难理解分子诊断方面所面临的挑战。
    $ m; F  q# Q8 W( ^2 I
    7 r& x- H- J( r& \昨天刚在八卦里贴了一个,http://www.aswetalk.org/bbs/thread-25733-1-1.html,这是一个很好的分子诊断的例子,并且符合现代医学的发展趋势。以后尽可能的在八卦里发一些小东西,最后写的东西应该都能用的上,慢慢来吧。

    手机版|小黑屋|Archiver|网站错误报告|爱吱声   

    GMT+8, 2026-10-6 10:48 , Processed in 0.069811 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表