|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。5 ~/ a4 |: E& \( n9 ^
0 E W7 M+ ]1 w2 p; f
string1: TACGGCATGGCTATCGTAGCTAG; K; M* S+ I o5 q/ l! y& N
; T1 h% R2 y- g+ s) F7 }: C% ^' b4 c
string2: GCTAT9 K, E" ]9 v( w8 R& V1 n7 a1 \
* K0 ~! R/ G+ H+ V! c0 w要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ( `) J* t8 E0 s: B) D. k2 f
2 d$ F$ p6 t. D! l拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。4 ] |2 \; c1 w; b9 o
, h/ R% c2 |) I) d) M) C+ d但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。2 y. i1 L3 Y# a6 `
, G1 T( {3 R; |( m. N: v$ w
那如果是这个样子
4 F5 O3 [/ I' `! i9 Q4 [' n+ o! A. V2 Z& }/ a0 t/ P7 B( n
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
7 l) e- ?1 U. F, y: I+ ^string2: TTAAA
; s* C7 }. G# E; f# w" B& ~) m, \9 o( f' p' O+ ]
是不是会快很多?" {( N9 v# z. A& A. Y
$ K7 p2 Q$ P" k, F
继续扛。 |
|