|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。! n2 ?$ J1 z y/ W
: Q) J+ o) V, q# I$ P
string1: TACGGCATGGCTATCGTAGCTAG+ n0 [" `7 Z7 d0 v3 ?; B
: W8 F$ C" t( d$ r. D2 p S' {6 Zstring2: GCTAT6 m3 t V9 x0 a6 S1 ?
9 Y( l; U- a/ V2 S0 m$ ^9 @
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
, u, Y9 u A5 d7 r1 e; m2 K0 o! u, y; p! F, l7 T
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。0 n9 E3 L! e* Q+ z8 j
. y4 Q0 S& |7 y6 y8 _+ K2 [" 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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
. P7 y' B6 z. z% Q7 J3 s% T$ A+ g' e g& r/ O0 U
那如果是这个样子
1 {( ~2 \& o! P* ^) F
" m; T% j n, X6 h, kstring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
7 N* O8 ]/ f; m2 Pstring2: TTAAA
6 `$ C7 f& C) Y: c1 R" d8 ]2 \- ~8 z
是不是会快很多?% r. |! Q: d2 O' }% d
3 c' m9 O# j% Z1 _ B继续扛。 |
|