|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
1 f3 s7 w& K+ G) @ }4 N
: Z$ g9 H5 a- M1 Bstring1: TACGGCATGGCTATCGTAGCTAG
- ]3 @* o1 v2 {/ N- |$ W5 w+ B# `7 h4 Q5 B
string2: GCTAT$ {0 u" I0 A) k p: M- y
+ B, {( G, O1 ^, g, Q要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 $ _( U) i O) m2 x% j2 z: j
8 x4 m" S1 I3 ^5 S, u* p I" N) r& L* n拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
2 t$ g: Z6 t' j- C4 I9 T) x3 x' e, y' U! m, w
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
" ]0 v; O1 a5 L/ Y2 g
0 |. p, C! {3 O' D那如果是这个样子
1 X1 ]4 T* G: d! o/ l2 ? y
5 d3 u, Z0 Z7 ^- I6 J6 _string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG/ |: t, y& ]" w
string2: TTAAA
% R( ^. j3 C. [( w; i/ l0 W( e% i1 F2 f. U3 S V9 N! Q8 m! r
是不是会快很多?6 S/ a5 i& M7 q
x# }6 V, {$ W5 f8 z) r2 A4 ^
继续扛。 |
|