|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。. s, Q5 k e4 ]1 l7 J( l( x+ D8 A
6 |3 `- o( R) E1 m- k$ y
string1: TACGGCATGGCTATCGTAGCTAG! T5 m8 S( B1 c5 [8 j2 O
: j7 O( t, P D* L% S! k4 G
string2: GCTAT( X, `; ~* r4 Y+ V
8 ~7 s( v5 j' A1 C
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
4 C+ P9 G a4 u! M: ~; S* Q1 Z1 L. C* ^4 Z7 }# Y1 Q/ e
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。% P- G( x8 ?+ F9 s, E! P; ]
" J/ I# d2 ?4 A0 F但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
& z7 X; ?- A8 C& J1 u. R! K- V' u* K6 I/ i+ d, e" E
那如果是这个样子
9 u3 d2 M* k1 q, L9 s+ F& w/ O3 w7 D2 ^
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG" V; h, u0 }1 ] m# o- v2 a2 g, s; S4 @
string2: TTAAA
1 S/ f: D4 U1 E! |
, a4 E) J' t: ~6 c, {: l' g是不是会快很多?$ O" m& |7 U. m6 F
+ }8 Q! h# E! p
继续扛。 |
|