|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。- m5 }4 M2 F, k( z1 z
" @3 j1 U4 D/ d0 U1 v$ e/ Wstring1: TACGGCATGGCTATCGTAGCTAG' E, Y4 z1 N$ E/ v) }* g. Y7 E
5 ~& ~; x6 o3 N9 P/ h4 ]string2: GCTAT4 Z1 Z. P) |9 D: b2 t
. v, a5 N8 L0 [& r# f3 V5 f7 V" n要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
0 \1 G$ H* B: t V+ b0 t0 S) j* `( u, V
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
, E) K2 E0 c& r D) C* N* _4 G9 d; U; f( s3 }- h, _( f& g% |
但是如果实际情况中,有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 Y* v5 P9 w0 J4 c
' p- }- Q* @/ r& q5 {2 E6 s2 M) c3 [
那如果是这个样子
5 m! [( G1 t) t: k ^7 M2 \& o' V/ G* f
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
/ D8 k0 d3 Z# o" tstring2: TTAAA: V- H. X. T$ n5 R
% h' a- B3 w/ v5 R1 M7 }是不是会快很多?
% B3 ?2 e* Z5 O3 @
. }- k7 Z. I0 {4 ^3 B7 }继续扛。 |
|