Teoría de la información II: árbol binario óptimo y codificación de Huffman

De un vistazo:


  1. "Ruido" y "Relación señal / ruido" de JSON

  2. El límite superior teórico de la cantidad de ruido, expresión polaca inversa

  3. Teoría de la información y tecnología de compresión: cadena frente a cadena de bytes

  4. Mejor árbol binario, FPS / 2.0

  5. Codificación de Huffman

  6. Paquete de mensajes

  7. Árbol de Huffman para el paquete de mensajes

  8. Prefijo VS separador

  9. Defecto del paquete de mensajes, error del entorno del host

  10. El límite de la serialización, dos axiomas básicos

  11. Compresión extrema UTF-8

  12. Número racional: cambio de tipo de longitud variable

  13. Método de compresión de diccionario

  14. Mutilación de cola

  15. Ultra Pack y el principio de reemplazo espacio-tiempo

  16. Metafísica del motor V8 (lo que está sucediendo debajo del capó)


"No  hablo de tecnología aquí, solo de pensar " .

Algunas tonterías.

Originalmente, este ppt estaba destinado a mostrarse en la conferencia FEConf de la compañía, pero la nueva epidemia de coronavirus a principios de año se lo dio a las palomas. Se dice que en la primavera de 16XX, estalló una trágica plaga en el área de Londres, y luego el gran Dios Newton produjo una serie de logros académicos importantes, incluido el teorema binomial y el cálculo cuando se aisló en casa, lo que condujo a la primera teoría humana. Explosión física

No ha habido avances en la física teórica para humanos durante casi 100 años , y todas las aplicaciones todavía se basan en la teoría de la relatividad y la mecánica cuántica a principios del siglo pasado. Así que yo y otros animales sociales, animados por la campaña "Emergencia de reserva teórica" ​​en Weibo y Moments, también tratamos de aprovechar el tiempo de aislamiento en casa para fingir que participamos en la ciencia, especialmente en la investigación teórica que está fuera del interés de la aplicación.

La dirección de mi investigación es la teoría de la información de Shannon (de la sección evolutiva en la estación B, se dice que la evolución se basa en la teoría de la información ????), quiero tener una mejor comprensión de la información, la entropía y la vida, y reducirme a través del aprendizaje. Entropía de la información, sobre la relación entre información y entropía, consulte el artículo anterior "Información y entropía [Parte 1] La vida se alimenta de información" . Este artículo es el segundo de la serie. El tema es sobre el algoritmo de compresión de información en la teoría de la información. El ppt que se preparó para el discurso de la empresa hace un año está completamente traducido en un artículo, y el contenido es más de un software de computadora.

01

-

Ruido JSON


Tema: Buscando los límites de la serialización.

¿Qué es la serialización? La serialización es un tipo de conversión sin pérdidas de datos multidimensionales en datos lineales unidimensionales. Es un método de codificación. La razón por la que se convierte en unidimensional es para un mejor almacenamiento y transmisión. Para conocer el conocimiento de la serialización, consulte este artículo .

La teoría de la información cree que la "codificación" es el proceso de convertir información de una forma o formato a otro. Por ejemplo, la codificación de caracteres es la conversión de información en formato de texto en formato de código de bytes. Por el contrario, la codificación base64 es el proceso de convertir el formato de código de bytes. Convierta a formato de texto. "Decodificar" es el proceso inverso de codificación.

Explicación del término: codificación

Entonces, JSON es un formato de serialización tan popular. JSON admite los cuatro tipos básicos de números reales, cadenas, booleanos y nulos y los dos tipos compuestos de listas y diccionarios. Es muy fácil de usar y, por supuesto, tiene sus deficiencias. JSON La "relación señal-ruido" es muy baja , pero es difícil decir cuánto.

Según la visión de la teoría de la información, datos = información + ruido. La fórmula de esta teoría en el formato de serialización basada en texto es: JSON = bit de tipo + bit de información . El bit de información es la cantidad efectiva de información contenida en json, y el bit de tipo es todo el ruido restante, incluidas las comillas dobles, comas, corchetes, corchetes, etc.

El ruido en json es comprimible, y algunas optimizaciones se pueden ver de un vistazo: si quita las comillas dobles de la "clave" en el par clave-valor, reemplace verdadero y falso con las letras ty f. Producirá ambigüedad.

Hay una jugabilidad más sofisticada: reemplaza todos los paréntesis en json con expresiones polacas inversas . También es una forma eficaz de reducir el volumen.

Además, el tipo de número real se almacena en forma de caracteres decimales, lo que no solo causa mucho ruido, sino que también aumenta el tiempo de conversión.

Si observa detenidamente, puede encontrar muchos datos redundantes en json, que se pueden comprimir continuamente, pero ¿ dónde está el límite de esta compresión? Debe haber un límite, json no se puede comprimir infinitamente.

02

-

¿Existe un límite para la compresión de datos?

Un anciano llamado González en España diseñó un algoritmo de compresión json, que también está basado en texto. Se dice que puede comprimir json profundamente anidado al 55%. Por ejemplo, hay un json como este:

{
    "type": "world",
    "name": "earth",
    "children": [
        {
            "type": "continent",
            "name": "America",
            "children": [
                {
                    "type": "country",
                    "name": "Chile",
                    "children": [
                        {
                            "type": "commune",
                            "name": "Antofagasta"
                        }
                    ]
                }
            ]
        },
        {
            "type": "continent",
            "name": "Europe"
        }
    ]
}

Esta cadena se obtiene a través de mi "algoritmo de compresión":

type|world|name|earth|children|continent|America|country|Chile|commune|Antofagasta|Europe^^^$0|1|2|3|4|@$0|5|2|6|4|@$0|7|2|8|4|@$0|9|2|A]]]]]|$0|5|2|B]]]

Y la tasa de compresión es sorprendente, incluso superando a MessagePack, que se discutirá más adelante, pero después de un estudio cuidadoso, se descubrió que en realidad usa el hábito de las personas de usar json para comprimir . Por ejemplo, la gente a menudo usa TypedArray (con lista de tipos), como json-schema De la misma forma se restringen los atributos de los objetos de la lista, el hermano González recopila y utiliza los mismos nombres clave que suelen aparecer, como nombre, id e hijos, lo que reduce el acoplamiento y reduce el volumen.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray

Introducción a TypedArray

Pero este tipo de algoritmo de compresión que usa el hábito no es duradero después de todo, porque el hábito cambiará, por lo que no se recomienda. En determinadas situaciones, o en un equipo fijo, este algoritmo sigue siendo útil.

Pero no se puede decir que usando este formato hoy, pensando en un mejor algoritmo de compresión mañana y cambiando a un nuevo formato, cuánto mejor es este "mejor", cómo cuantificarlo y cuál es el límite superior, estas son las preocupaciones de la teoría de la información. Para encontrar este límite, es necesario estudiar el formato "fundamental" de la información: un formato binario, no un formato de texto basado en un formato binario. Las mejoras y optimizaciones en el formato de texto nunca pueden alcanzar el límite de compresión de información . Por tanto, la contradicción central en la evolución de los formatos de serialización es: formato de texto vs. formato digital.

En resumen, el formato de texto es un formato de transición "perezoso" en el desarrollo de los tiempos . Debido a las características simples y extensibles del formato de texto, muchos formatos de serialización tempranos, http e incluso familias de protocolos ip aún conservan el formato de texto. Especialmente el protocolo http / 1.X, que ocupa más del 90% del tráfico de Internet. Dado que el encabezado y el cuerpo (json) de http / 1.1 están todos en formato de texto, http también ha encontrado un cuello de botella en el rendimiento: en términos de tiempo, compilación y análisis de texto http Una pérdida de tiempo; en términos de espacio, una gran cantidad de campos en el encabezado http desperdicia espacio.

03

-

Teoría de la información y tecnología de compresión

Pero a partir de http / 2.0 (en lo sucesivo, h2), esta atmósfera poco saludable ha comenzado a cambiar. Para la cabeza y el cuerpo, h2 utiliza diferentes algoritmos de compresión para mejorar la eficiencia. Para los encabezados estáticos, h2 usa codificación de longitud fija para comprimir, es decir, asignar un número fijo a cada encabezado de uso común, como content-type: text / html. Para el encabezado dinámico, puede personalizar los valores de encabezado y valor, y h2 usa la codificación de longitud variable ASCII: codificación Huffman.

Hasta ahora, la parte principal de http se ha digitalizado completamente, y la parte del cuerpo está definida por el usuario y aún conserva el formato de texto de json, pero w3c hace un llamamiento a todos para que usen las alternativas de json, pero no hay una declaración directa sobre qué alternativas, permítanos Siéntase libre de elegir el formato de serialización binario.

Nota: El proceso de cambiar el formato de texto a un formato binario se llama "digitalización" porque el formato binario se parece más a un "formato digital".

04

-

Árbol binario óptimo

Dado que w3c nos recomienda utilizar el formato de serialización binaria codificado por Huffman, es necesario comprender la estructura de datos de Huffman: el árbol binario óptimo.

La forma más directa de diseñar un conjunto de códigos es la codificación de longitud fija, es decir, la longitud de cada tipo / carácter es fija, como la codificación ASCII de 8 bits de longitud fija. Como se muestra en la figura, diseñar 5 tipos de caracteres con codificación de longitud fija requiere una longitud de codificación de al menos 3 bits. En la figura, cada hoja de un árbol binario completo con una profundidad de 3 es un carácter, pero las 3 hojas restantes se desperdician porque no se utilizan.

En este momento, la longitud del carácter utilizado con más frecuencia se puede comprimir de 3 a 1. El significado de esto es sacrificar la cantidad de códigos sin sentido para salvar la longitud de los códigos significativos. Se genera un árbol binario óptimo después de asignar una longitud de codificación de 1 bit al carácter con la mayor frecuencia de uso.

05

-

Codificación de Huffman

Esta "codificación óptima de árbol binario" es en realidad un sinónimo de "codificación Huffman". La codificación de Huffman es una codificación de longitud variable, es decir , la longitud de cada objeto de codificación es diferente, pero cualquier disposición y combinación no provocará ambigüedad . Pero el costo de cambiar de codificación de longitud fija a codificación de longitud variable es: mayor volumen (pérdida de la profundidad total de las hojas). Por lo tanto, cuando la frecuencia de uso de todos los objetos es constante (o la frecuencia es impredecible), es más eficiente usar codificación de longitud fija, lo que significa " un cierto perímetro y el área cuadrada más grande ".

Por supuesto, el algoritmo de generación del propio árbol de Huffman se basa en la frecuencia de uso de diferentes objetos, desde las hojas hasta la raíz del árbol, para que el árbol binario sea óptimo, se omiten los detalles del algoritmo.

<Continuará>


Vista previa del próximo episodio: "Buscando los límites de la serialización"

Supongo que te gusta

Origin blog.csdn.net/github_38885296/article/details/104853355
Recomendado
Clasificación