¿Qué otras formas fundamentales de compresión de datos, pero la omisión de patrones irrelevantes y la explotación de patrones repetitivos existen?

Como señala, la compresión de datos puede explotar redundancias en un mensaje. El código Morse, por ejemplo, usa los símbolos más cortos para las letras más frecuentes.

Con respecto a la “información irrelevante”, cuando los canales telefónicos eran caros, TPC empacaría más llamadas en un número limitado de canales omitiendo los silencios.

Aquí hay algunas otras técnicas:

Transformaciones

Es posible que tenga una mezcla de formas de onda de aspecto caótico, por ejemplo, pero si toma la Transformada de Fourier, puede quedar claro que solo hay unas pocas frecuencias presentes. La señal puede ser mucho más compresible en el dominio de transformación que en el original. Esta es una parte importante de los codificadores de imagen y video. Se usan transformaciones bastante extrañas incluso en la compresión de texto, como la transformación de Burrows-Wheeler.

Predicciones

Por ejemplo, muchos codificadores de voz usan un modelo de tracto vocal y eligen parámetros del modelo para que coincidan mejor con la señal. La señal de excitación para el modelo se elige entonces como un zumbido (para el habla sonora) o un silbido (para el habla sorda). Uno o varios predictores pueden coincidir con elementos clave de la señal, y cuando se restan de ella dejan un “residuo” que es de menor energía o cuyas características exactas no son realmente perceptibles. Los parámetros del modelo son luego datos comprimidos y transmitidos. Consulte “Predicción lineal de código excitado”

Funciones hash

Por ejemplo, podría enviarle el hash de mi mensaje, y usted podría generar todos los mensajes, mirar aquellos que coincidan con el hash y elegir el que sea inglés gramatical en lugar de ruido aleatorio. Esto puede ser computacionalmente inviable para mensajes largos, pero es bastante viable para mensajes cortos o partes de los mismos.

Fuentes correlacionadas

Si quiero enviarle mensajes sobre política, y ambos podemos recibir CNN, entonces podemos usarlo como un recurso compartido. (Ver codificación de lobo slepiano)

Codificación de red

Si un grupo de personas quiere enviar mensajes diferentes a un grupo de destinatarios diferentes, entonces pueden codificarse conjuntamente en beneficio de todos.

Complejidad de Kolmogorov

En lugar de enviarte un mensaje, te envío un programa que, cuando lo ejecutas, reproduce el mensaje. El programa puede hacer y puede usar recursos arbitrarios acordados (diccionarios, etc.)

Me gustaría centrarme en la compresión sin pérdidas, donde los datos originales se pueden reconstruir exactamente a partir de la representación comprimida, por lo que no hay “omisión de patrones irrelevantes”.

En ese caso, toda la compresión de datos se basa en patrones de explotación: si no hay patrones, eso significa que los datos son ruido blanco puro, que es fundamentalmente incompresible: dado cualquier código sin prefijo con función de longitud [math] L [/ math] y una secuencia [matemática] x [/ matemática] de [matemática] n [/ matemática] bits aleatorios, la probabilidad de que comprimamos al menos [matemática] d [/ matemática] bits es exponencialmente pequeña en [matemática] d [/ matemática] :

[matemáticas] P (L (x) \ le nd) \ le 2 ^ {- d}. [/ matemáticas]

Por lo tanto, debe ser excesivamente afortunado de comprimir el ruido blanco en más de uno o dos bits.

Entonces, toda compresión se basa en patrones de explotación en los datos. La pregunta restante es, ¿qué patrones es capaz de explotar un algoritmo de compresión?

Tiene razón en que la mayoría del software de compresión existente explota las subcadenas repetidas de una forma u otra. Pero realmente, cualquier tipo de patrón computable que se te ocurra podría ser utilizado por un software de compresión. Por esta razón, la mejor manera de comprimir un archivo es en forma de un programa de computadora que lo construye: el programa de computadora puede explotar cualquier patrón que esté en el archivo original. Esta es la idea detrás de la complejidad de Kolmogorov.

Ejemplos de patrones que la mayoría del software de compresión no puede manejar, pero que podrían ser explotados por un compresor ideal:

  • Todos los bytes pares son aleatorios, todos los bytes impares son iguales al último más uno (pasando de 255 a 0). (Una compresión ideal solo almacenaría los bytes aleatorios, reduciendo a la mitad el tamaño del archivo. ¡Pero intente pegar dicho archivo en zip!)
  • Los datos están encriptados (compresión ideal: comprima el archivo después de desencriptarlo por primera vez. Almacénelo junto con la clave de encriptación y al desempaquetar la encriptación).
  • Los datos son la salida de un generador de números pseudoaleatorios. (Una compresión ideal solo almacenaría el valor semilla).
  • Los datos son en realidad una subsecuencia de la expansión binaria del número [math] \ pi [/ math] (una compresión ideal simplemente calcularía [math] \ pi [/ math]).

Si bien estas representaciones comprimidas ideales serían impresionantes, es muy difícil encontrar patrones tan generales en los datos (y el problema completo es incluso incuestionable). Entonces, el arte de la compresión de datos consiste en encontrar una clase de patrones que ocurren a menudo en la práctica y que no son difíciles de explotar utilizando un algoritmo eficiente. Las subcadenas repetidas siguen siendo los patrones más útiles.

More Interesting

Cómo encontrar un segmento en una matriz con un número máximo de elementos con suma S

¿Aproximadamente cuánto más rápido es el GCD binario que el algoritmo euclidiano para la aritmética de precisión fija en las computadoras actuales?

¿Qué imprime el siguiente programa: #include int sum, count; vacío principal (vacío) { para (cuenta = 5; suma + = 'cuenta;) printf (% d, suma);}?

¿Cómo funcionan los algoritmos de procesamiento de cadenas en CUDA?

¿Qué tipo de operaciones podrían aplicarse sobre un árbol de segmentos?

¿Cuáles son algunas de las preguntas famosas al calcular los caminos más cortos (gráficos) usando Dijkstra's, DAG y Bellman-Ford?

¿Cuál es la mejor prueba de primalidad que garantiza un resultado 100% exacto pero que se puede hacer en un tiempo polinómico?

¿Cuáles son algunos buenos algoritmos para agrupar palabras que suenan similares?

¿Cuáles son los libros de Ciencias de la Computación (Algoritmo) que recomendará un topcoder?

Si una computadora toma el control total del control del tráfico aéreo, ¿cómo será el algoritmo? ¿Cómo manejará los aterrizajes de emergencia y cómo manejará una pista paralela?

¿Cómo diferenciar entre algoritmos de clasificación internos y externos en términos simples? ¿Cómo se lo explica a los principiantes?

¿De qué sirve el hashing en C?

¿Qué estructura de datos es adecuada para almacenar una gran cantidad de cadenas en Java?

Cómo implementar un código C para la eliminación de un nodo de una lista vinculada considerando todos los casos de prueba

¿Dónde puedo aprender conceptos de recursión?