|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
2 r A3 l, G" e6 D" a
( f0 j5 U; ~& ]/ o, {( \6 Pstring1: TACGGCATGGCTATCGTAGCTAG
8 b5 X `; N2 V! E+ O
5 _" r& s5 m3 s% n: vstring2: GCTAT1 n" ]2 c) K9 m6 `6 {" m
2 Y( n/ y" a3 y% Y, W& O9 }; b p3 Y
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
+ y q% ?" `" ]" n. U' `# z( D# H1 j0 Z4 Z
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。" h0 s7 X, Q% } h# S
' T2 u; k j# J5 u! n
但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。( g9 t' s" t& v, q
4 Z! p7 @. a5 A/ S0 x
那如果是这个样子
" G: G) N$ Z0 f* v% v/ F. q- w- b/ X+ n* i! w9 f: `
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG7 r) F& a2 f+ U8 w: f8 a) |
string2: TTAAA
3 \: o3 }& b) \( l
, D) O/ T4 o! w' k! Z7 t: n是不是会快很多?8 T" K) B, Y# b- h, t
# N2 _, C9 F# O) s+ q% S% ?继续扛。 |
|