|
|
9#

楼主 |
发表于 2013-10-7 09:01:33
|
只看该作者
最野蛮也是最简单的办法:一个一个比。
, x8 Z V: p: m% Y, D
: v7 y8 x0 U1 z2 v" istring1: TACGGCATGGCTATCGTAGCTAG9 c9 O+ |8 A; S A2 n% p, @* f
' N0 g" F# r# R2 f7 g) y
string2: GCTAT
2 s6 Y* g( w9 Z9 {& L, @ r% r5 H# e' B4 [# X" X8 t
要求在string1里找到string2的位置,如果存在多个的话,都要找出来。
+ ]! S9 ?# h, B7 u
) E/ C8 y" f6 h, `9 h, F/ A! n拿string2和string1比,至少需要比string1的长度减去string2的长度再加1次。在实际应用中,如果string1的长度是10^9,而string2只有一二百,那么做一次基本上就是比10^9次。当然如果很幸运,string2在string1开始的地方,那一次就够了。所以平均来说,要比10^9/2次,也就是O(10^9)。7 y7 _' i1 `* P# O/ o
# n/ {; ]( E: J& d2 \- \: Q但是如果实际情况中,有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年!!!人都死几次还没比完,太郁闷了,所以不可接受。
! X6 _6 \! v5 E, D8 l7 U
& b2 ?% _5 ^9 ?+ ~, |! W% ]- b那如果是这个样子
/ u- H5 X. g( n) @" v! M
3 B4 p; ?: E' n7 J/ Ystring1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG# |6 C" y6 x" f
string2: TTAAA9 X% \: B T2 L' M/ m
8 R! D" Q. M0 c5 D/ `* j
是不是会快很多?9 `# S( o F* X. F
- ]9 s" ^2 I- \: j- l& A' F继续扛。 |
|