|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
( ]! J" c1 {+ `5 p
$ T. m* B: `/ e, Lstring1: TACGGCATGGCTATCGTAGCTAG! L0 C' J0 f, x; }. L: f
$ F. c- u6 `6 k# _! `3 \
string2: GCTAT
% g8 Z( g: i9 L+ G) B6 ~; U6 r, u5 s |/ _6 r( ?+ c) o7 R: o! {* F6 Q6 j
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
4 i, b F" D _5 V1 H' E
# ~' I2 {* S& @" G `$ P8 m1 ?拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
) T; D6 y" l% g2 b6 d
% c2 a8 U. q# y- a7 L但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
$ @ S+ w# G y z% C, O/ ?) m' K6 b
, C2 m8 V9 n3 J$ N1 K' }* r- F那如果是这个样子
) z6 w. K I0 t% r5 g- `- f3 u+ V6 y8 M* [! w1 X: f$ f, L
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG1 s) s% K3 N! |. v2 w- J
string2: TTAAA, n6 J8 _ Z& \2 a. f
% L j1 T: ?; X f) D1 ^
是不是会快很多?
' V: R: q; T& N+ p
4 K" Q( o- |6 I/ Q K继续扛。 |
|