|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
4 F6 h6 F M4 T! ~
+ y# R2 u, o8 i4 O P6 hstring1: TACGGCATGGCTATCGTAGCTAG
, E& u1 D7 y1 J. K+ A
. @3 a0 P- e0 @string2: GCTAT
) w" v% K& h, { a( U1 k: C* Q/ C$ ]
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ! ]' s: c4 S7 E4 G3 l4 R
+ A# `6 S/ W3 l" u' a
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
1 C& T+ O; Q& N- J
3 C# J, b4 B* _# E8 o0 Y但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。" d$ E6 Y2 d; T! g) b; I
" y1 q6 j# k6 R" ~( F( `
那如果是这个样子
% j( `1 a% f9 B) ], ^9 s9 W$ _8 _, t' k- ^7 J' i3 t
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG+ g+ ~' Z( n) W2 l
string2: TTAAA: s, z* U& K% U$ R6 g- L! m" K
& R/ K- I, }: l1 { f9 K3 V
是不是会快很多?
' e8 C, g Z. Z; Y- Y. z" }
3 i Z. \' V% c' j/ K继续扛。 |
|