|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
# \: Q3 L. G# s& ?0 P* I
+ j; ?# A$ p& `/ _string1: TACGGCATGGCTATCGTAGCTAG
2 y y+ K/ v. X0 r1 K' r$ M
; s; ?2 I& f0 L9 u, S8 Wstring2: GCTAT( L0 a6 e% @& ]3 |( d3 F8 l
+ l8 T! j, F) w9 z2 Z, }. \
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 $ T& r' ?- i/ ~" ?' d
. q/ @; f/ k. {2 L! }' D, o4 ?5 I
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。8 p7 R6 C; I; X7 J* A4 O7 ?: `
4 C* i. J0 E3 n! q3 `" 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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
7 G) a' g# f% r* `5 C- C- n5 f% [0 U4 B9 v
那如果是这个样子
# Q( U" F! ~! Z6 ]# Z$ d$ f% b; Q8 W6 a c* y
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG3 i p8 V, H; T5 d" O
string2: TTAAA
' ?% N# H6 e/ h9 q. h1 c8 u* T# C" v/ O; A- a9 w% |
是不是会快很多?( l; l5 }& y7 w4 e
7 G2 {" ~ l4 M$ w' w( W
继续扛。 |
|