|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
" @' W4 L! `/ ^+ }
& ^/ Y& ~3 i$ W# i6 astring1: TACGGCATGGCTATCGTAGCTAG; y* y$ j# R2 U. A2 L( Y
! e0 V1 t0 f$ K+ }5 K8 M$ k( {. }! Q
string2: GCTAT2 R6 P' l1 i* B. M: g
: v5 t7 _$ @0 ?' w/ z% ~2 D
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 : l, J9 K7 j2 t. g4 C8 e1 D: K
+ D! j' v( Q' _! D0 u$ H& H0 H+ x9 S拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。! r3 U+ j: x$ v: N5 y
, C& ]" d: i1 C4 \) X. I
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
6 `, G: q# h/ A6 W" n3 E+ b' D* n% A" m, Z
那如果是这个样子
) F: S9 o2 t. n+ | U- x v3 [- T @" u4 \9 \7 Q+ J- H
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
9 G) [; ]- u+ K( X) u, M: K; rstring2: TTAAA |# i+ _ K! i2 O ?
! n% E+ I, U7 j6 {+ A是不是会快很多?: j% j- g& W$ U. m- x
- @5 d, d9 @$ V. J: s1 f
继续扛。 |
|