|
9#
楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。5 Q, N. Z: n( j O" e
' |, p& p/ B; m4 h# M3 |; o
string1: TACGGCATGGCTATCGTAGCTAG3 [: T t( d8 Y9 J" s& j- _# L
# L1 P0 L r: q
string2: GCTAT% }' G! V, y [" t# Z0 w% m5 k
8 W0 _) ~) u$ k1 r i5 ~& B! |
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 9 u6 Z/ c5 I$ j* Y3 |" O/ \
5 D1 V# z. z% v7 v# J R拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
: r" M& m. ^. I, s0 G" J- H6 X: Y4 e! _( [5 s8 [) j
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。' }3 y! @" p' S
$ [$ A3 g- `) q$ f1 _3 L
那如果是这个样子0 u, E# z! t* E3 T% S, Q: e6 T
2 ?" I5 Z" h$ V' T9 Astring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG) e/ z' C$ n1 _9 }0 R" K0 K( I
string2: TTAAA3 Z9 `$ V0 Q0 L$ z1 G
l- W8 _& ~4 W/ o2 s是不是会快很多?; U' {' W8 P) n: T
, \+ ~9 y9 A4 Z1 x1 I' X! Z8 F- z
继续扛。 |
|