|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
( @# z5 [5 C0 I5 A( M3 |/ z. v, W# ?2 G6 f6 {
string1: TACGGCATGGCTATCGTAGCTAG
5 |( A, u5 V' P. M. s" U! R; o! R
6 @3 [' j, n" K& r: zstring2: GCTAT0 V4 {. t5 i- {/ d7 k- j: H
0 T1 M1 ^% a( h1 _要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
9 s8 ?$ B) F- X& m
8 F" Z8 g# L8 F/ B9 v4 t拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。8 Z$ t+ I* ?; o) m D2 n$ N
. |* b3 |1 E2 ?( M Y6 |, I
但是如果实际情况中,有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 a+ |( K9 h/ M0 O2 a+ M
8 i3 [9 g, z( y- W+ m g4 |, M9 l那如果是这个样子0 B$ T! P& K6 x: M6 ~
9 r# I+ N# x9 G- ~2 i! xstring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG* K! q+ ^# F! J- J. \$ e
string2: TTAAA
3 n1 ^" Y8 t9 J- e2 y: }8 u0 N2 h
% e, s1 q- J3 V是不是会快很多?6 Z2 n0 b( Q# Y& X
8 }) `# I( U* F. v4 k继续扛。 |
|