09/12/2010
En el vasto mundo de la informática y la bioinformática, el manejo eficiente de grandes volúmenes de datos es un desafío constante. Ya sea analizando secuencias genómicas o comprimiendo archivos de texto, necesitamos herramientas que nos permitan procesar la información de manera rápida y que ahorre memoria. Una de estas herramientas fundamentales es la Transformada de Burrows-Wheeler (BWT), un algoritmo ingenioso que, aunque no comprime datos por sí solo, los prepara de una manera que facilita enormemente la compresión posterior y permite la construcción de estructuras de datos muy eficientes para la búsqueda.

La BWT es una transformación de datos que permuta reversiblemente los caracteres de una cadena. Su principal propósito es reestructurar los datos de tal manera que se vuelvan más compresibles para algoritmos posteriores como la codificación Run-Length Encoding (RLE) o la codificación de Huffman. Esto se logra agrupando caracteres similares, especialmente aquellos que a menudo aparecen juntos en el texto original.

¿Qué es la Transformada de Burrows-Wheeler?
La Transformada de Burrows-Wheeler es un algoritmo de preprocesamiento que reordena una cadena de texto. No reduce el tamaño del archivo, sino que reorganiza sus caracteres. Su gran utilidad radica en que, una vez transformada, la cadena resultante tiende a tener secuencias de caracteres idénticos (llamadas 'runs' o 'rachas') mucho más largas y frecuentes que el texto original. Estas rachas son el objetivo ideal para los algoritmos de compresión que sí reducen el tamaño del archivo, como los utilizados en la utilidad bzip2 de Unix.
La magia de la BWT reside en su reversibilidad. A pesar de la aparente complejidad de la transformación, es posible reconstruir la cadena original a partir de la salida de la BWT, con un mínimo de información adicional.
¿Cómo Funciona la BWT?
El proceso de la Transformada de Burrows-Wheeler se basa en la manipulación de las rotaciones cíclicas de la cadena de entrada. A continuación, se detallan los pasos principales:
Paso 1: Añadir un Marcador de Fin de Texto (EOF).
Para garantizar que la transformación sea reversible y que podamos distinguir la cadena original de sus rotaciones, se añade un carácter especial al final (o al principio) de la cadena. Este carácter debe ser único y no aparecer en el texto original. Comúnmente se utiliza el símbolo '$' o '^'. Este marcador se considera lexicográficamente menor que cualquier otro carácter del alfabeto utilizado. Por ejemplo, si nuestra cadena es "BANANA", la convertimos en "BANANA$".
Paso 2: Generar Rotaciones Cíclicas.
Se crean todas las posibles rotaciones cíclicas de la cadena modificada (con el marcador EOF). Una rotación cíclica consiste en mover el primer carácter al final, y repetir este proceso hasta que la cadena original vuelva a aparecer. Para la cadena "BANANA$", que tiene 7 caracteres, generamos 7 rotaciones:
- BANANA$
- ANANA$B
- NANA$BA
- ANA$BAN
- NA$BANA
- A$BANAN
- $BANANA
Paso 3: Ordenar Lexicográficamente las Rotaciones.
Todas las rotaciones generadas en el paso anterior se ordenan alfabéticamente (o lexicográficamente). Utilizando el ejemplo "BANANA$" y considerando '$' como el carácter más pequeño, el orden sería:
- $BANANA
- A$BANAN
- ANA$BAN
- ANANA$B
- BANANA$
- NA$BANA
- NANA$BA
Esta lista ordenada de rotaciones forma conceptualmente una matriz, donde cada fila es una de las rotaciones ordenadas.
Paso 4: Extraer la Última Columna.
La salida de la Transformada de Burrows-Wheeler es la última columna de la matriz formada por las rotaciones ordenadas. Tomando la última columna de la lista ordenada del paso 3:
- $BANANA -> A
- A$BANAN -> N
- ANA$BAN -> N
- ANANA$B -> B
- BANANA$ -> A
- NA$BANA -> A
- NANA$BA -> $
La cadena resultante es "ANNBAA$". Esta es la Transformada de Burrows-Wheeler de "BANANA$". Observe cómo los caracteres que preceden a secuencias comunes en el texto original (como 'A' antes de 'NA' o 'B' antes de 'ANANA') tienden a agruparse en la salida.
¿Por Qué la BWT es Útil para la Compresión?
La clave de la utilidad de la BWT para la compresión reside en la propiedad de la última columna obtenida. Al ordenar las rotaciones lexicográficamente, las filas que comienzan con secuencias de caracteres similares tienden a agruparse. Por ejemplo, si la cadena original contiene muchas veces la secuencia "ANA", las rotaciones que empiezan con "ANA" se listarán juntas. Los caracteres que preceden a esta secuencia "ANA" en el texto original aparecerán en la última columna de estas filas agrupadas.
Consideremos el ejemplo "BANANA$". Las rotaciones "ANA$BAN" y "ANANA$B" comienzan con "ANA". En la cadena original "BANANA$", 'N' precede a la primera "ANA" y 'B' precede a la segunda "ANANA". En la última columna de la matriz ordenada, los caracteres 'N' y 'B' aparecen en las filas correspondientes. Aunque no son idénticos, la tendencia general en textos más largos y con más repeticiones es que los caracteres en la última columna se agrupen en largas secuencias de caracteres idénticos.

Estas secuencias de caracteres repetidos (las "rachas") son muy fáciles de comprimir. Un algoritmo como Run-Length Encoding podría reemplazar "AAAAA" por algo como "5A", logrando una gran reducción de tamaño. La BWT crea estas rachas, haciendo que el texto transformado sea mucho más susceptible a la compresión efectiva por métodos posteriores.
La Transformada Inversa de Burrows-Wheeler
Una de las características más notables de la BWT es su capacidad de ser invertida. Dada la cadena transformada (la última columna) y la posición del marcador EOF (o el marcador EOF en sí), podemos reconstruir la cadena original.
El proceso inverso puede entenderse de la siguiente manera: la última columna de la matriz ordenada contiene todos los caracteres de la cadena original, solo que en un orden diferente. Si ordenamos alfabéticamente los caracteres de la última columna, obtenemos la *primera* columna de la matriz ordenada. Por ejemplo, si la última columna es "ANNBAA$", al ordenarla obtenemos "A$AABNN". Esta es la primera columna de la matriz ordenada.
Ahora tenemos la primera y la última columna. La magia de la BWT es que hay una correspondencia entre los caracteres de la primera columna y los de la última columna en la misma fila. Por ejemplo, si la primera fila empieza con '$' y la última columna termina con 'A', sabemos que el carácter que sigue a '$' en la cadena original es 'A'. Usando esta correspondencia y la información de la posición del EOF, podemos reconstruir la cadena original carácter por carácter, o reconstruir la matriz paso a paso.
Un método para visualizar la inversión es construir la matriz columna por columna. Empezamos con una tabla vacía. Insertamos la cadena BWT ("ANNBAA$") como la primera columna y ordenamos las filas. Luego, insertamos la cadena BWT de nuevo como la segunda columna y volvemos a ordenar. Repitiendo este proceso tantas veces como la longitud de la cadena, reconstruimos la matriz ordenada completa. La fila que termina con el marcador EOF es la cadena original (sin el marcador, por supuesto).
Aplicaciones de la BWT
La principal aplicación práctica de la BWT es como paso inicial en algoritmos de compresión de datos sin pérdida. Como se mencionó, la utilidad bzip2 la emplea junto con otras técnicas de compresión.
Sin embargo, la BWT ha encontrado un hogar especialmente importante en la bioinformática. La búsqueda eficiente de patrones (secuencias cortas) dentro de textos muy largos (como genomas completos) es una tarea crucial. La BWT, combinada con estructuras de datos como el FM-index (Full-text index in Minute space), permite realizar búsquedas extremadamente rápidas y con un uso de memoria muy reducido. El FM-index utiliza la BWT para crear un índice comprimido del texto de referencia, lo que permite buscar patrones directamente sobre la representación comprimida sin necesidad de descomprimir el texto completo. Esto es vital cuando se trabaja con genomas que pueden tener miles de millones de caracteres.
El concepto de k-orden en los FM-indexes, mencionado en el contexto de la búsqueda de patrones cortos, es una mejora que optimiza aún más estas estructuras basadas en BWT para tipos específicos de consultas, demostrando la continua evolución y relevancia de estos algoritmos en campos de datos masivos.

Consideraciones Técnicas y Optimización
Aunque el método conceptual de construir y ordenar la matriz es útil para entender cómo funciona la BWT, las implementaciones eficientes no construyen explícitamente toda la matriz de rotaciones, ya que consumiría demasiada memoria para textos largos. En su lugar, utilizan estructuras de datos más avanzadas, como los arrays de sufijos, que permiten calcular la última columna directamente y realizar la inversión de manera mucho más rápida y con menor consumo de memoria.
La relación matemática entre la BWT y el array de sufijos es profunda y permite implementar ambos algoritmos de manera eficiente. El array de sufijos de un texto T es un arreglo de las posiciones iniciales de todos los sufijos de T, ordenados lexicográficamente. Resulta que el carácter BWT en una posición dada está directamente relacionado con el carácter que precede al sufijo que comienza en la posición correspondiente del array de sufijos.
Preguntas Frecuentes sobre la BWT
¿La BWT comprime realmente los datos?
No, la BWT es una transformación que reordena los datos. Su objetivo es hacer que la cadena transformada sea más compresible para algoritmos de compresión posteriores como RLE o Huffman.
¿Por qué se necesita el marcador de fin de texto ($ o ^)?
El marcador EOF es crucial para la reversibilidad de la transformación. Permite identificar de manera única la fila que corresponde a la cadena original en la matriz ordenada de rotaciones, lo cual es necesario para la reconstrucción.
¿Qué es el FM-index y cómo se relaciona con la BWT?
El FM-index es una estructura de datos eficiente para la búsqueda de patrones en textos largos, especialmente utilizada en bioinformática. Se basa en la Transformada de Burrows-Wheeler para crear un índice comprimido que permite buscar patrones directamente sobre los datos transformados, ahorrando una gran cantidad de memoria.
¿Funciona la BWT igual de bien para cualquier tipo de datos?
La BWT es particularmente efectiva en textos que contienen muchas repeticiones de subcadenas, como el lenguaje natural o las secuencias de ADN y ARN. En datos muy aleatorios, la Transformada de Burrows-Wheeler puede no generar tantas rachas de caracteres idénticos, por lo que su beneficio para la compresión posterior podría ser menor.
Conclusión
La Transformada de Burrows-Wheeler es un algoritmo elegante y potente que ha demostrado ser fundamental en el campo de la compresión de datos y la búsqueda de patrones en grandes conjuntos de información, con un impacto significativo en áreas como la bioinformática. Al reordenar el texto de una manera peculiar pero reversible, crea una representación que maximiza la eficiencia de los algoritmos de compresión posteriores y sirve como base para estructuras de búsqueda innovadoras como el FM-index. Su capacidad para transformar datos de manera que se vuelvan más manejables y analizables subraya su importancia en el procesamiento moderno de la información.
Si quieres conocer otros artículos parecidos a La Transformada de Burrows-Wheeler (BWT) puedes visitar la categoría Radio.
