# Método de Burrows-Wheeler

O Método de Burrows-Wheeler , também conhecido pela sigla em inglês BWT, é um processamento estatístico de um bloco de dados que aumenta a redundância espacial, facilitando a aplicação de técnicas de compressão de dados.
Diferentemente de outras técnicas usadas para compressão de dados que trabalham com um fluxo contínuo de bytes tratados um a um, o método de Burrows-Wheeler trabalha com blocos geralmente grandes de dados que são processados em conjunto antes de serem comprimidos.

## Funcionamento

A teoria por trás do método de Burrows-Wheeler é que, dado um símbolo presente no bloco de dados, há uma grande probabilidade desse símbolo ser sempre precedido do mesmo conjunto de símbolos. Por exemplo, na língua inglesa: a letra "H" tem maior probabilidade de ser precedida pela letra "T" do que por qualquer outra letra. Usando este princípio, o método tenta construir uma seqüência de caracteres L que satisfaça as seguintes condições:
* Qualquer região de L tende a apresentar uma concentração de apenas poucos símbolos. Isso permite que L seja facilmente comprimido por técnicas de move-to-front e RLE.
* É possível reconstruir o bloco de dados original com pouca ou nenhuma informação adicional.
A forma como o método de Burrows-Wheeler atinge este objetivo é a seguinte: em primeiro lugar, constrói-se uma matriz n x n onde n é o tamanho do bloco a ser comprimido. Esta matriz é preenchida na primeira linha com o bloco original; na segunda linha com o bloco rotacionado a esquerda de uma posição; na terceira linha com o bloco rotacionado de 2 posições, e assim por diante, até termos na última linha o bloco rotacionado de n-1 posições. O exemplo abaixo demonstra o processo:
O segundo passo é agora reordenar esta matriz em ordem lexicográfica, obtendo então a seguinte matriz:
Desta nova matriz podemos preencher as condições dadas mais acima com apenas duas informações: a última coluna, que preenche a condição 1, e o número I da linha que corresponde ao bloco original (neste caso, a linha 3, pois iniciamos a contagem em 0). Podemos ver que na última coluna desta nova matriz os simbolos "a" e "_" se acumularam em uma parte específica da matriz. Em um bloco de tamanho maior, este efeito é ainda mais acentuado, melhorando ainda mais a eficiência dos métodos de compressão.
Os dados que precisamos comprimir então são a linha L = "aaaadss_c__aa" e o número I = 3

### Operação reversa

Reconstruir a primeira coluna da matriz ordenada a partir dos dados comprimidos (a última coluna e o número da linha original) é um processo fácil: basta reordenar a linha L que acabamos de descomprimir, obtendo assim "___aaaaaacdss". Durante este processo de reordenação, construímos um novo vetor que mapeia as posições da letra na L antiga para a sua respectiva posição na cadeia ordenada. Por exemplo, a primeira posição da cadeia, letra "a" se encontra na posição 3 da cadeia ordenada, a segunda letra "a" se encontra na posição 4 da cadeia ordenada, e assim por diante, obtendo-se então o vetor T = (3,4,5,6,10,11,12,0,9,1,2,7,8).
Com este vetor T e o valor I armazenado junto com a cadeia comprimida podemos então reconstruir a cadeia original S pela seguinte fórmula: $S[n-1-i]\gets L[T^{i}[I]],$ para $i=0,1,...,n-1$ onde $T^{0}[j]=j,$ e $T^{i+1}[j]=T[T^{i}[j]].$
A reconstrução dos primeiros elementos da cadeia original fica então sendo:
$i=0\Rightarrow S[13-1-0]=L[T^{0}[I]]=L[T^{0}[3]]=L[3]={\mbox{a}},$
$i=1\Rightarrow S[13-1-1]=L[T^{1}[I]]=L[T[T^{0}[I]]]=L[T[3]]=L[6]={\mbox{s}}...$

## Aplicações

O método de Burrows-Wheeler foi difundido principalmente pelo utilitário de compactação de dados bzip2.