|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
9 H: D9 I4 Z( N3 D$ O
6 B8 M* I# e' G ], Ystring1: TACGGCATGGCTATCGTAGCTAG
; }3 C- P% A1 n) ?& T: d
1 \5 `' Y. N: a, u( B% Lstring2: GCTAT
! H# u6 f2 m5 X2 L D! e/ A9 @% }7 `9 b- ]
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
# T3 @5 n/ \! g7 `# T
4 h2 h- \1 K- y" L4 n! G+ B! L拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。/ R# ~8 n: J- e/ L4 p4 |$ ?
) d- P; b+ u- f f: H
但是如果实际情况中,有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 J* _3 x4 V, j" N$ ]8 f0 a+ q" \6 o
那如果是这个样子' [8 O Q2 G0 M: B* z
# l8 Q% W$ p# _# o [, bstring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
4 M/ g9 ~% f. k& jstring2: TTAAA# w4 o/ Y1 j5 T+ `# S, h
, E* m# m0 `3 @" b/ [, F9 \ j
是不是会快很多?
1 a; P0 G( Z# v6 j1 r% k, X" m7 M+ `1 F9 W- N4 V5 O4 H% S, U
继续扛。 |
|