|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
9 w A* |' @. W6 J# r m$ q' A& F r
# O4 h5 x+ w4 U3 l; Q: fstring1: TACGGCATGGCTATCGTAGCTAG
% b, \6 \* u8 i# m" N. o7 P5 j7 e7 ` V; {
string2: GCTAT0 n. i- p/ l9 Y9 c- Q( \6 T
8 f# ]3 {7 T p K6 Z
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ' j9 @, e& t2 z7 D' [
. v, [5 P- Y5 {' ~( E. U拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
D3 e8 J) ~9 X6 x9 p
7 j. y5 W. o) G但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
5 A W# d+ Z/ m _+ ?. |* n5 W6 @5 E# h0 Q6 k$ g2 h" M( r% j. D, Z0 p
那如果是这个样子
" `7 J$ Z8 |6 E; X" h9 i2 _% `( |, {# U# ~
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG# A+ k! M/ Y# w' g
string2: TTAAA
; `3 O7 s8 _7 w" t" S5 q9 N5 {) n2 C
" ^8 i9 V a, e/ p是不是会快很多?
& z& _- Y# T7 d: E* o7 u: t8 Y0 a% f) b) {) }! ]9 Y
继续扛。 |
|