|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。9 r! t4 s$ s( B- O/ O% E+ {
& `! X2 z9 M+ ?+ e# R1 P9 A6 wstring1: TACGGCATGGCTATCGTAGCTAG z- H/ v( R, R
5 b9 R( `0 @8 cstring2: GCTAT0 }. A, p) O% R0 `* q+ T
+ C: ?8 v4 b9 P! T7 U
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
, {/ G8 |& e6 Y
8 K9 `$ d) n: s, n6 P拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
1 K* _, L* b8 i' j, b$ M+ k3 \* }. R0 U! A( n* `0 R7 o6 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年!!!人都死几次还没比完,太郁闷了,所以不可接受。( P" ]! G% h3 x0 O
- [/ t/ v' s3 r! j8 B那如果是这个样子
9 A% g: z. B5 Q7 j9 s* t& A3 D1 `8 Z% o0 ^. A+ D5 k
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG; Y0 ^4 e/ |) F; _$ S. g7 o7 O
string2: TTAAA
2 z8 d" S0 e' C# b4 a% J {# u. o( |! V. ]& F6 Q: Q2 t( i! L4 u6 x, Q* J! k
是不是会快很多? l0 k& K$ f9 @( x
9 F4 l1 k$ {9 e, c# q% x
继续扛。 |
|