|
本帖最后由 喜欢喝冰茶 于 2013-10-6 20:40 编辑 % F! T/ x- l9 ?8 K! S
如果两个字符串是这个样子& [* M7 o' x! y' N& D, [. I
$ }6 ^5 T# o2 v6 e- [4 X( @
string1: AAAAAATTTTCCCCCGGGTTTTAAAACCCCCCGG
, O% o3 d# w1 v$ q6 estring2: TTAAA
. q4 G6 ?0 B! v0 u! F3 c
x8 z0 \" L" K4 C当然要省很多时间,因为不需要对string1一个一个比了!!!4 K6 ]. c) }7 [0 c, S
K- ^. ^' T; X' F4 bstring1可以写成:4 B4 A. L! W. s
长度 字符 起始位置
5 ~3 i: x2 F. O! ], j2 |6 A 1( v4 }( b' l& Q, ?8 r
4 T 7
; v0 u( J9 e& P! A5 C 11& O+ D2 P0 u, C3 \( z' x" P! b
3 G 16
: q+ n, i, _9 M* R( g1 L4 T 19
( U( R# M& D! g% S......# A$ P+ q& F: \6 X* P( x
- q: i+ E- q Q# N/ ^/ y1 f+ ]3 @, a1 l所以当用string2去比的时候,一开始根本就不用考虑字符为A,G,C的行,因为string2开始是T。因此在这个例子中,不需要去检查string1的每个位置,而是非常有限的几个位置,所以可以省很多时间。& b7 `$ C( U5 ?) M% {* |) K& p
% ~8 p" h V6 L0 I$ y }7 B
那么如果存在一种这样的转换方法能够将主贴里的字符串转化成这种,势必会省很多时间。有这样一种方法吗?哪里去找?& D" z# I' J4 y) _* ~6 ? ^
$ X1 a& Z, ?9 K; ~9 L }" `如果你是有心人,你觉得这个东西最常用在哪里?/ t; e. c$ K% L A$ L0 x
1 L8 C; R8 t. F5 r对了,文件压缩。
# E1 O6 L6 G: U! M6 C6 y7 Q9 y/ u y& I( u% ]- \2 F
事实上,真正的解决方法就是借鉴了最早用于文件压缩的一种算法,称为Burrows-Wheeler Transform,又称block-sorting compression。这是当年在DEC工作的Michael Burrows和David Wheeler发明的,所以以他们的名字命名,bzip2的压缩文件就是基于该算法的。它的转换其实很简单,如果感兴趣大家可以google/wiki(wikipedia上很详细的操作细节)上去看细节,但简单的来说,就是把一个字符串头围相接,不停的移动一位,然后排序,最后取出最后一列就行了。Burrows-Wheeler Transform的特性就是转换后的字符串相对于原始字符串含有大量的重复字符片段,所以就可以使得我们的问题变的相对快捷。
4 V/ q& t5 ^5 [( T6 W( h! H1 w+ [( Y H }7 U4 m
那么是否就十全十美,万事大吉了呢?这个需要从实际的具体需求来看。8 t2 r4 i5 o% x2 E9 E, o1 o, }7 M
; Y+ I4 E& `( c6 u1 I扛吧,没什么好说的。
0 y. _' O. L; v0 B$ D
" O; Q$ X+ N' n/ f! I. \5 u |
|