|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
# k- Q0 Z3 \* C' F
+ M! j3 i5 Q5 _5 }' o$ m0 x O8 r* s9 v8 w" kstring1: TACGGCATGGCTATCGTAGCTAG
: r$ \/ z2 G, _' V* D
0 q, O2 ?/ G3 D5 f! {string2: GCTAT
& D" b3 \0 e" `2 Z$ s0 X0 M0 ~6 T, Q/ k7 U$ N4 k9 d
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。 , H9 u6 H$ D& m \! \% U. O
4 q y8 p' \+ l" B, {. { A" b
拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。
$ y' t. s0 @2 q2 e; O# g6 [& X2 j
0 v" U; c! Y9 d. R$ D, g但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
; r2 x' c$ m/ r' j ?% e* L- h+ W* u& B: o+ ]
那如果是这个样子
: z c- {- v b- ^) j& l
# ^7 T; O4 F" _string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG/ W( Q/ V' X6 O
string2: TTAAA- Z5 l% k! b1 L' C* b
. Q! Y4 }9 a. w是不是会快很多?& Z K- F" ^' D5 H4 @( R* M
# W- h' ]& }3 L, ^0 g
继续扛。 |
|