|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
' \! Z8 r/ R0 {* @ F" o
, }1 j: y( ]/ |, H, t8 f5 }% y3 U6 Ystring1: TACGGCATGGCTATCGTAGCTAG% C' K% ^' m, @: O, x- W
7 }' _& S! H! J2 w; R% b# estring2: GCTAT( [0 r4 i" V, [4 I s; n
L( V" y' H8 F! p要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ! K% {% f% U F, K
& d. {, \! @$ X. b2 ?3 R" J/ }
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
; L2 s* o5 r( d* D% _! |- F' K
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。9 |4 E- }- ?+ J; e: ?
6 d5 D+ ?+ U& E$ E2 A3 o+ l
那如果是这个样子
1 S8 H6 |8 J2 J8 H3 C7 Z3 Q, ~+ p8 U$ N# \7 S
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG4 K, D X8 z. U0 ?, Y, p
string2: TTAAA5 Z1 X T) e! w! h' s6 g
6 H1 Y3 R# _2 O9 a是不是会快很多?
2 ~3 H" J o3 Q: \! V* a, F( k$ Y3 h' H3 Q& `
继续扛。 |
|