|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
7 \3 z" s* Q: e; P+ s
1 O3 z' J K2 n5 H, h- {string1: TACGGCATGGCTATCGTAGCTAG/ K4 _# f) Z8 p6 u# i6 l
1 J9 G5 c1 d# d% G0 ^: R& t/ [, {
string2: GCTAT
/ E( R# ?7 o7 p! ], y0 }. [) \: M W; J6 t1 {
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
" y! z. o- P8 v8 \: r1 R+ n4 c0 M, M5 K
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。2 r/ R& H: r) o& m( m: Y
0 w' K, S0 \. u H& o& x
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。0 s+ q0 i6 M$ Q* f- z. ]0 B
1 N: n w1 l( O) H, e+ W% N
那如果是这个样子
& }( d) l; k, W/ r z5 f7 G1 C& Y' S9 R. S" Q+ Z
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
4 G3 I1 ^' F1 l5 K% g/ U& m5 Zstring2: TTAAA6 {, T. o; Z" T8 P" S0 b
+ b* V& }; b! B! q# e( {
是不是会快很多?
% C O: [2 K s* o6 t3 `' [
- h( g( T# l; M* o& {8 y5 `5 z继续扛。 |
|