|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
' e7 n* y. u# [. O. [- t
. L6 ?) a# @1 v$ s4 K# Sstring1: TACGGCATGGCTATCGTAGCTAG
2 X, i$ z* Y4 _/ T+ h o1 l
8 @" A# ] h% Z( astring2: GCTAT
( ^$ F$ S0 q6 G/ Q, ~, r7 A4 R. x" s# y7 ?, ]
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 ( s- R8 j- X) [! D& p
1 O6 @2 A5 s9 \! J* F- y拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
3 u% l; }4 t1 {5 N: e
8 F4 C d' u0 L+ v; T( C# F1 k但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。" H, `; R4 N. i& A% {/ J7 A7 ]
0 e S* [. c7 K" v0 Z
那如果是这个样子2 R3 D$ |! i X" D6 W# b+ t; n6 [
" y7 @. N" t* I0 a6 dstring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
, ^+ M. @, h* s0 ^+ v! R1 ^string2: TTAAA
' W1 |3 K2 a. ^1 D6 `% K4 n4 W9 q/ p% [
是不是会快很多?' p1 U/ m, x# V$ T! i+ H3 ~; t
! R5 I, g6 x" L- l
继续扛。 |
|