|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
/ P# \4 X- S& u0 b2 _0 c w8 u7 ^# T/ N8 K
string1: TACGGCATGGCTATCGTAGCTAG
! K; g# X) R1 e. w* `
+ a: \, r- t7 a3 Ystring2: GCTAT, l8 I% A; g* @3 q
$ Y. b( K% \: m) z) e7 [7 @
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 _1 E" O. v) I! |
2 J/ N; o& @% [+ d( h; B8 W拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。+ z) U9 B6 Z2 k0 O0 i
7 L- U& @6 Z1 ]) v) z
但是如果实际情况中,有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 o- m& l. b1 @ d8 j) Z
; t( H! r5 w. D- W3 D6 x
那如果是这个样子
; o2 Q$ m% S5 v# ~" G1 ~1 Q7 {' K: K9 ]* r
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG: a7 M/ e5 ~" G
string2: TTAAA
8 \) s. l: z( R |$ X T5 g& B: ^9 B, a
是不是会快很多?/ ~% p& v K$ f, }, I
6 ?6 w# `2 s v
继续扛。 |
|