|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。 F B' K9 R; }, g9 F2 V. L
* j! w3 u( U& x3 g4 m# o2 T4 g: R* Q) gstring1: TACGGCATGGCTATCGTAGCTAG
: s" C1 ?6 Y3 M$ h, G6 z
( `6 F" d; M5 q7 G, c5 V( estring2: GCTAT
. P1 k% V/ j9 E7 @1 }4 Y/ c; J5 p) V" b* {8 @1 t
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 * D6 U5 ?6 g* F
5 P& C! }9 t7 O1 O0 N9 g( R
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。: l0 f- p/ a' i* J; c0 \
7 r4 q' j# w* A, G, ]4 _
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。4 O. [. y! u: H8 D
7 |, {: F& e, @0 F
那如果是这个样子
5 r# v9 H, o' T
9 _* k3 T' r8 s! x6 w& Pstring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG0 Q5 E& I# l' m% o+ ]2 P' K
string2: TTAAA$ ~: N7 j0 }' t' Y" W' m; t
/ j+ D6 U3 D5 j) {+ N7 V _9 j
是不是会快很多?+ O2 O2 x. Q6 Y, l9 T1 F1 T
" W# O% ?% `0 s+ k! u4 f1 Y
继续扛。 |
|