Codificación por longitud de racha (RLE)

Escribe cualquier texto y observa cómo se divide en rachas — las repeticiones consecutivas del mismo carácter colapsan en un único par (símbolo, conteo). Las rachas largas reducen los datos; las rachas cortas los agrandan.

Cargando simulación interactiva...

Lección

La teoría — Codificación por longitud de racha (RLE)

La codificación por longitud de series sustituye cada serie maximal de símbolos idénticos por un único par (símbolo, cuenta). A la lectura no llega el texto, sino dos números: N caracteres y R series. Cualquier otra cifra de la página es el cociente de esos dos.

Qué significa cada símbolo

N
el número de caracteres que entran — la longitud de lo que has escrito, nada más.
R
el número de series, es decir, bloques maximales de un mismo símbolo repetido. R sube en uno allí donde dos vecinos difieren: cuenta fronteras, no caracteres.
N/R, la longitud media de las series. Es la única cantidad que decide el resultado.
ratio
N/2R, es decir L̄/2. Por encima de 1 la salida es menor que la entrada.

De dónde viene la fórmula

  1. Cuenta series, no caracteres. En 0010111100001111 los vecinos difieren en cinco puntos, así que hay seis series y la fila muestra R=6.
  2. El tamaño codificado es 2R y nada más. De qué están hechas las series no entra nunca en la cuenta: seis series cuestan doce unidades, sean píxeles, letras o dígitos.
  3. Divide: ratio = N/2R = L̄/2. El equilibrio queda pues en L̄ = 2, y es exactamente alcanzable — escribe AABB y las barras marcan 4 bytes de entrada y 4 de salida.
  4. Los dos sentidos no son simétricos. Hacia arriba no hay límite: una sola serie de un millón de caracteres se codifica en un par. Hacia abajo el suelo está en 0.50× y no se puede rebajar, porque lo peor que puede hacer una entrada es dar a cada carácter su propia serie.

Cómo leer lo que ves

Los cuatro ejemplos miden exactamente dieciséis caracteres, y por eso conviene leerlos como un conjunto. Línea de imagen tiene tres series y da 6 bytes. Series clásicas tiene cuatro y da 8. Máscara de bits tiene seis y da 12. Peor caso tiene dieciséis y da 32. La misma longitud de entrada, y sale entre 6 y 32 bytes — un factor cinco, decidido por completo por R. Escribe luego hello world: once caracteres, diez series, 20 bytes. La prosa corriente se sitúa en la parte baja de ese rango, y ésa es toda la razón por la que este método es una pieza dentro de los compresores y no un compresor por sí solo.

Supone
Que un par cuesta exactamente 2 unidades, que un símbolo y una cuenta ocupan lo mismo, y que una cuenta puede ser de cualquier tamaño. Los codificadores reales dan a la cuenta un ancho fijo — un byte, o sea 255 — y deben partir una serie más larga en varios pares, lo que sube el equilibrio algo por encima de 2. El supuesto de ancho igual falla justo donde este método brilla: en un fax de 1 bit el símbolo ocupa un bit y la cuenta no.
Falla cuando
El suelo de 0.50× no es un defecto pendiente de resolver. Un codificador sin pérdidas tiene que ser reversible, de modo que entradas distintas den salidas distintas; y hay menos cadenas cortas que largas a las que enviarlas. Todo esquema que acorte aunque sea una entrada alarga por fuerza alguna otra. Es un hecho de conteo, no una propiedad de este método. PackBits, en la tercera idea de arriba, baja su peor caso a un byte de control por cada 128 — menos del 1% — y hasta ahí llega cualquiera, porque el suelo se puede bajar sin límite pero nunca alcanzar. Lo que hace este método es llevar ese coste por fuera, en una lectura que puedes ver moverse.

por qué el punto de equilibrio es exactamente 2 🖖

Cada racha — sin importar su longitud — cuesta lo mismo almacenar: 2 unidades, una para el símbolo y otra para el conteo. Una racha de longitud L solo merece la pena codificarla cuando eso cuesta menos que escribir L caracteres en bruto — es decir, cuando L es mayor que 2. Promediado sobre toda la entrada, esa condición se convierte en L̄ = N/R mayor que 2, donde N es la longitud total y R es el número de rachas — exactamente la línea que comprueba la fórmula de arriba. Esta es también la razón por la que RLE es un compresor de propósito general pobre: el texto en inglés, el código fuente y los datos aleatorios rara vez tienen rachas más largas que 2, por lo que RLE se reserva para datos diseñados a propósito para tener rachas largas — escaneos de fax de 1 bit, bitmaps dispersos e imágenes con paleta y áreas de color plano. Los formatos reales llevan la idea más lejos: PNG aplica un filtro delta Paeth/Sub/Up sobre cada línea de escaneo antes de comprimir, convirtiendo primero los degradados suaves en largas rachas de diferencias casi nulas — RLE (a través de DEFLATE) hace el resto. Prueba el ejemplo del peor caso de arriba: dieciséis caracteres distintos dan dieciséis rachas de longitud 1, así que la codificación necesita 32 unidades para almacenar 16 — la entrada duplica su tamaño.

la compresión que inventarías tú mismo 🖖

La codificación por longitud de series es la única idea de compresión que podrías reinventar por tu cuenta: en lugar de escribir WWWWWWW letra por letra, dices simplemente "7 W" — el mismo atajo que usamos al leer "triple siete" en un número de teléfono. Recorre los datos en una sola pasada de izquierda a derecha y no recuerda nada más allá de la serie que está contando, lo que la hace rápida y fácil de transmitir en flujo. Y es sin pérdidas: a partir de los pares (símbolo, cuenta) puedes reconstruir el original exactamente, a diferencia de JPEG o MP3, que descartan detalle para siempre.

el primo de RLE que no puede explotar 🖖

La RLE ingenua puede duplicar los datos incompresibles, pero la variante PackBits de Apple — nacida en el MacPaint de los años 80 y aún un modo de compresión estándar en TIFF — está diseñada para casi nunca crecer. Cada bloque empieza con un byte de control con signo: un valor no negativo significa "los siguientes bytes son literales", uno negativo "repite el byte siguiente". Los datos únicos se copian tal cual en bloques de hasta 128 bytes, así que el peor caso añade solo un byte de control por cada 128 — menos del 1 % de sobrecarga en vez del 100 % que la RLE ingenua puede alcanzar.

Problema resuelto al detalle

  1. Codificación run-length de AAAAAABBBCCDDDDD en cuatro pares 5 pasos

    La codificación por longitud de ráfaga convierte AAAAAABBBCCDDDDD en cuatro pares. Calcula la compresión y, a continuación, la condición exacta bajo la cual este esquema hace que un archivo sea más grande.

    1. La codificación es la evidente: reemplazar cada ráfaga por el carácter y su longitud. Dieciséis caracteres se reducen a cuatro pares.

    2. Dos números describen cualquier entrada de este esquema —su longitud y su número de ráfagas— y su proporción es la longitud media de ráfaga. Aquí es 4.

    3. Ahora contemos de forma rigurosa. Cada par cuesta dos símbolos, un carácter y un recuento, de modo que la salida es 2R frente a una entrada de N. Nada más sobre los datos importa.

    4. Así pues, el esquema sale ganando exactamente cuando 2R < N, lo que se despeja como una longitud media de ráfaga superior a 2. Aquí son 8 frente a 16 —una reducción exacta a la mitad— y la línea de veredicto del panel dice lo mismo con un solo símbolo.

    5. Por debajo de ese umbral pierde, y con una longitud media de ráfaga de 1 pierde al máximo: cada carácter se convierte en un par, duplicando el archivo.

    Respuesta

    La herramienta muestra N = 16 y R = 4, una ráfaga media de 4 y un ahorro de 2×. La condición es lo que hay que recordar: RLE comprime si y solo si las ráfagas promedian más de dos, y es uno de los pocos esquemas de compresión cuyo punto de equilibrio es un único número que se puede comprobar a simple vista. Escribe ABCD en la casilla y observa cómo se duplica su tamaño. Eso no es un fallo: es la razón por la que RLE solo sobrevive donde las ráfagas están garantizadas por construcción: líneas de escaneo de fax, mapas de bits dispersos y las regiones planas de un JPEG tras la cuantización, nunca en texto general.

Ruta de aprendizaje

Compresión a mano

Lleva a Huffman la idea en su forma más pura: sustituir una serie de símbolos idénticos por el símbolo y un recuento.

Referencias (3)

Problemas de ejemplo

  • Rachas clásicas - "AAAAAABBBCCDDDDD" → (A,6)(B,3)(C,2)(D,5): 16 caracteres en 8 pares
  • Peor caso - "ABCDEFGHIJKLMNOP": todos los caracteres son únicos, cada par es más largo que el original
  • Máscara de bitmap - "0010111100001111": fila de píxeles que muestra por qué PNG aplica un prefiltrado antes de RLE
  • Línea de escaneo de imagen - "WWWWWWWBBBBBWWWW": fila simple de imagen en blanco y negro, con una estructura de rachas fuerte