|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
) n a4 e. z$ P% t# T5 G& Z5 I7 h& [4 x8 D* ]0 i) G
string1: TACGGCATGGCTATCGTAGCTAG
7 V& ^3 A. k7 x" ~4 D$ R8 j) g' E8 I% x) U
string2: GCTAT
2 O/ p0 V' w5 \, K/ {
% u3 Q8 U9 W- F. a要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ; B, _2 X, l* N2 C. |, b0 g/ I4 f
9 a8 ]+ Q( ?4 ?4 f s9 {拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
: n( A/ p& _3 c& U. w+ p8 ^$ Y# Z+ y: t1 x; T6 d0 J$ e
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。) W" S. ~' d2 r n) O+ k1 `
( w8 L! p: L x5 W' E3 u
那如果是这个样子
' Y6 q* W% W& K. D# j+ C( D' v7 V, X, O w3 D" U
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG; Q/ c9 E3 }' P+ j% t/ J" q: T" D L
string2: TTAAA& v1 s6 A; s, }: W1 ?0 n' i
( m/ ` c' |8 E) S是不是会快很多?$ ^, c6 R; c8 Q
0 u0 u+ |6 K2 z7 Z6 W
继续扛。 |
|