Teoria da Informação II: Árvore Binária Ótima e Codificação de Huffman

Num relance:


  1. "Noise" e "Signal to Noise Ratio" do JSON

  2. O limite superior teórico da quantidade de ruído, expressão polonesa inversa

  3. Teoria da Informação e Tecnologia de Compressão: String vs. String de Byte

  4. Melhor árvore binária, FPS / 2.0

  5. Codificação Huffman

  6. Pacote de Mensagens

  7. Árvore Huffman para Message Pack

  8. Separador de prefixo VS

  9. Defeito no Message Pack, bug no ambiente do host

  10. O limite de serialização, dois axiomas básicos

  11. Compressão extrema UTF-8

  12. Número racional: mudança de tipo de comprimento variável

  13. Método de compressão de dicionário

  14. Mutilação da cauda

  15. Ultra Pack e o princípio da substituição do espaço-tempo

  16. Metafísica do motor V8 (o que está acontecendo sob o capô)


"  Não falo de tecnologia aqui, apenas de pensamento. "

Que absurdo.

Originalmente, esse ppt deveria ser exibido na conferência FEConf da empresa, mas a nova epidemia de coronavírus no início do ano deu isso aos pombos. Diz-se que na primavera de 16XX, uma trágica praga estourou na área de Londres, e então o grande Deus Newton produziu uma série de grandes realizações acadêmicas, incluindo o teorema binomial e cálculo quando ele estava isolado em casa, o que levou à primeira teoria humana. Explosão da física ...

Não houve nenhum progresso na física teórica para os humanos por quase 100 anos , e todas as aplicações ainda são baseadas na teoria da relatividade e na mecânica quântica do início do século passado. Por isso, eu e outros animais sociais, incentivados pela campanha "Emergência de Reserva Teórica" ​​no Weibo e nos Momentos, também tentamos usar o tempo de isolamento em casa para fingir que estamos nos dedicando à ciência, especialmente à pesquisa teórica que está fora do interesse de aplicação.

Minha direção de pesquisa é a teoria da informação de Shannon (da seção evolutiva na estação B, é dito que a evolução é baseada na teoria da informação ????), eu quero ter uma melhor compreensão da informação, entropia e vida, e me reduzir através da aprendizagem Entropia de informação, sobre a relação entre informação e entropia, consulte o artigo anterior "Informação e Entropia [Parte 1] A vida se alimenta de informação" . Este artigo é o segundo da série.O tema é sobre o algoritmo de compressão de informação na teoria da informação.O ppt que foi preparado para a palestra da empresa há um ano está totalmente traduzido em um artigo, e o conteúdo está mais voltado para software de computador.

01

-

Ruído JSON


Tema: Procurando os limites da serialização.

O que é serialização? A serialização é um tipo de conversão sem perdas de dados multidimensionais em dados lineares unidimensionais. É um método de codificação. A razão pela qual é convertido em unidimensional é para melhor armazenamento e transmissão. Para saber mais sobre serialização, consulte este artigo .

A teoria da informação acredita que "codificação" é o processo de conversão de informações de um formato ou formato para outro. Por exemplo, a codificação de caracteres é a conversão de informações em formato de texto em formato de bytecode. Pelo contrário, a codificação de base64 é o processo de conversão do formato de bytecode. Converta para o formato de texto. "Decodificar" é o processo reverso de codificação.

Explicação do termo: codificação

Então JSON é um formato de serialização tão popular. JSON suporta os quatro tipos básicos de números reais, strings, booleanos e nulos e os dois tipos compostos de listas e dicionários. É muito fácil de usar e, claro, tem suas deficiências. JSON A "relação sinal-ruído" é muito baixa , mas é difícil dizer quanto.

De acordo com a visão da teoria da informação, dados = informação + ruído. A fórmula dessa teoria no formato de serialização baseado em texto é: JSON = bit de tipo + bit de informação . O bit de informação é a quantidade efetiva de informação contida em json, e o bit de tipo é todo o ruído restante, incluindo aspas duplas, vírgulas, colchetes, chaves, etc.

O ruído em json é compactável e algumas otimizações podem ser vistas rapidamente: se você remover as aspas duplas da "chave" no par de valores-chave, substitua true e false pelas letras t e f. Irá produzir ambigüidade.

Há uma jogabilidade mais sofisticada: substitua todos os parênteses em json por expressões polonesas reversas . Também é uma forma eficaz de reduzir o volume.

Além disso, o tipo de número real é armazenado na forma de caracteres decimais, o que não apenas causa muito ruído, mas também aumenta o tempo de conversão.

Se você olhar com atenção, poderá encontrar muitos dados redundantes em json, que podem ser compactados continuamente, mas onde está o limite dessa compactação? Deve haver um limite, json não pode ser compactado infinitamente.

02

-

Existe um limite para a compactação de dados?

Um velho chamado González na Espanha projetou um algoritmo de compactação json, que também é baseado em texto. Diz-se que ele pode compactar json profundamente aninhado para 55%. Por exemplo, há um 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 string é obtida através do meu "algoritmo de compressão":

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]]]

E a taxa de compressão é incrível, ultrapassando até MessagePack, que será discutido mais tarde, mas após um estudo cuidadoso, descobriu-se que ele realmente usa o hábito das pessoas de usar json para compactar . Por exemplo, as pessoas costumam usar TypedArray (com lista de tipos), como json-schema Da mesma forma, os atributos dos objetos da lista são restritos: o irmão González coleta e usa os mesmos nomes-chave que aparecem com frequência, como nome, id e filhos, o que diminui o acoplamento e diminui o volume.

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

Introdução ao TypedArray

Mas esse tipo de algoritmo de compressão usando o hábito não dura, afinal, porque o hábito vai mudar, então não é recomendado. Em certas situações, ou em uma equipe fixa, este algoritmo ainda é útil.

Mas não se pode dizer que usando este formato hoje, pensando em um algoritmo de compressão melhor amanhã, e mudando para um novo formato, quão melhor é esse "melhor", como quantificá-lo e qual é o limite superior, essas são as preocupações da teoria da informação. Para encontrar esse limite, é necessário estudar o formato "fundamental" da informação: um formato binário, não um formato de texto baseado em um formato binário. As melhorias e otimizações no formato de texto nunca podem atingir o limite da compressão da informação . Portanto, a contradição central na evolução dos formatos de serialização é: formato de texto vs. formato digital.

Em suma, o formato de texto é um formato de transição "preguiçoso" no desenvolvimento dos tempos . Devido às características simples e extensíveis do formato de texto, muitos formatos de serialização anteriores, http e até famílias de protocolo IP ainda mantêm o formato de texto. Especialmente o protocolo http / 1.X, que ocupa mais de 90% do tráfego da Internet. Como o cabeçalho e o corpo (json) do http / 1.1 estão todos em formato de texto, o http também encontrou um gargalo de desempenho: em termos de tempo, compilação e análise do texto http Uma perda de tempo; em termos de espaço, um grande número de campos no cabeçalho http desperdiçam espaço.

03

-

Teoria da Informação e Tecnologia de Compressão

Mas a partir de http / 2.0 (doravante referido como h2), essa atmosfera doentia começou a mudar.Para cabeça e corpo, h2 usa algoritmos de compressão diferentes para melhorar a eficiência. Para cabeçalhos estáticos, h2 usa codificação de comprimento fixo para compactar, ou seja, atribuir um número fixo a cada cabeçalho comumente usado, como content-type: text / html. Para o cabeçalho dinâmico, você pode personalizar os valores de cabeçalho e valor, e h2 usa a codificação de comprimento variável ASCII: codificação Huffman.

Até agora, a parte principal do http foi totalmente digitalizada, e a parte do corpo é definida pelo usuário e ainda mantém o formato de texto json, mas w3c apela a todos para usar alternativas json, mas não há nenhuma declaração direta sobre quais alternativas, vamos Sinta-se à vontade para escolher o formato de serialização binário.

Nota: O processo de alteração do formato do texto para um formato binário é chamado de "digitalização" porque o formato binário é mais parecido com um "formato digital".

04

-

Árvore binária ótima

Como o w3c recomenda o uso do formato de serialização binária codificado por Huffman, é necessário entender a estrutura de dados de Huffman: a árvore binária ideal.

A forma mais direta de projetar um conjunto de códigos é a codificação de comprimento fixo, ou seja, o comprimento de cada tipo / caractere é fixo, como a codificação ASCII de 8 bits de comprimento fixo. Conforme mostrado na figura, projetar 5 tipos de caracteres com codificação de comprimento fixo requer pelo menos 3 bits de comprimento de codificação. Na figura, cada folha de uma árvore binária completa com uma profundidade de 3 é um caractere, mas as 3 folhas restantes são desperdiçadas porque não são usadas.

Neste momento, o comprimento do caractere usado com mais frequência pode ser comprimido de 3 para 1. O significado disso é sacrificar o número de códigos sem sentido para salvar o comprimento dos códigos significativos. Uma árvore binária ótima é gerada após atribuir um comprimento de codificação de 1 bit ao caractere com a maior frequência de uso.

05

-

Codificação Huffman

Esta "codificação de árvore binária ideal" é na verdade um sinônimo de "codificação de Huffman". A codificação de Huffman é uma codificação de comprimento variável, ou seja , o comprimento de cada objeto de codificação é diferente, mas qualquer arranjo e combinação não causará ambigüidade . Mas o custo de mudar da codificação de comprimento fixo para a codificação de comprimento variável é: aumento do volume (perda da profundidade total das folhas). Portanto, quando a frequência de uso de todos os objetos é constante (ou a frequência é imprevisível), é mais eficiente usar a codificação de comprimento fixo, que significa " um determinado perímetro e a maior área quadrada ".

Obviamente, o algoritmo de geração da própria árvore de Huffman é baseado na frequência de uso de diferentes objetos, da folha à raiz da árvore, de modo que a árvore binária é ótima e os detalhes do algoritmo são omitidos.

<Para ser continuado>


Prévia do próximo episódio: "Procurando os limites da serialização"

Acho que você gosta

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