|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
' |; m3 P L7 s% o& p1 d) A
1 u2 F: G5 g: e- Wstring1: TACGGCATGGCTATCGTAGCTAG9 |- `3 J+ Q4 n+ v; X
& @7 c- X1 d( Q3 z4 Estring2: GCTAT
$ q ~, Z. N& n- o- s
+ k+ i6 R3 S. w; Z要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 # B& m3 Z: G7 u. S3 S& N
' W# n' [$ m6 h z3 g$ ?1 P4 K8 t
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。" ]1 V" |" @0 D: _! J) w! z& `( ^
4 {0 {% ~* o3 R Y* K" F但是如果实际情况中,有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 n$ N h% g8 s4 ]8 l6 t8 A$ m; B6 v
那如果是这个样子/ T- S: N! Q" e, [6 ?
2 s# p6 _9 h, x: ~2 ^8 t8 p, c# B
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
& b& S4 p0 |* C! kstring2: TTAAA
) Q; d& M f8 S2 M# G S. a4 G, V d4 S; E) Q$ Q% k! V0 A
是不是会快很多?
( a9 ~! \3 Z' Z' h3 w
& H0 |# f# U4 N$ k! Y继续扛。 |
|