Para um número tão pequeno de bits, é inviável salvar muitos bits, como apontou Glorfindel . No entanto, se o domínio que você está usando tiver mais alguns bits, você poderá obter economias significativas para o caso médio, codificando intervalos com o valor inicial e um delta.
Vamos supor que o domínio seja o número inteiro, então 32 bits. Com a abordagem ingênua, você precisa de 64 bits (início, fim) para armazenar um intervalo.
Se mudarmos para uma codificação de (start, delta), podemos construir o final do intervalo a partir disso. Sabemos que, no pior dos casos, o início é 0 e o delta tem 32 bits.
2 ^ 5 é 32, então codificamos o comprimento do delta em cinco bits (sem comprimento zero, sempre adicione 1), e a codificação se torna (início, comprimento, delta). Na pior das hipóteses, isso custa 32 * 2 + 5 bits, então 69 bits. Portanto, no pior caso, se todos os intervalos forem longos, isso será pior do que a codificação ingênua.
Na melhor das hipóteses, custa 32 + 5 + 1 = 38 bits.
Isso significa que, se você precisar codificar muitos intervalos, e cada um deles cobrir apenas uma pequena parte do seu domínio, você acaba gastando menos espaço, em média, usando essa codificação. Não importa como as partidas são distribuídas, uma vez que a partida sempre terá 32 bits, mas importa como os comprimentos dos intervalos são distribuídos. Se os comprimentos mais pequenos que você tiver, melhor a compactação, mais os intervalos que cobrirão todo o comprimento do domínio, pior será a codificação.
No entanto, se você tiver vários intervalos agrupados em torno de pontos de partida semelhantes (por exemplo, porque obtém valores de um sensor), poderá obter economias ainda maiores. Você pode aplicar a mesma técnica ao valor inicial e usar um viés para compensar o valor inicial.
Digamos que você tenha 10000 intervalos. Os intervalos são agrupados em torno de um determinado valor. Você codifica o viés com 32 bits.
Usando a abordagem ingênua, você precisaria de 32 * 2 * 10 000 = 640 000 bits para armazenar todos esses intervalos.
A codificação da polarização leva 32 bits e, na melhor das hipóteses, a codificação de cada intervalo 5 + 1 + 5 + 1 = 12 bits, para um total de 120 000 + 32 = 120 032 bits. Na pior das hipóteses, você precisa de 5 + 32 + 5 + 32 bits, portanto 74 bits, para um total de 740 032 bits.
Isso significa que, para 10.000 valores em um domínio que leva 32 bits para codificar, obtemos
- 120 032 bits com a codificação delta inteligente na melhor das hipóteses
- 640 000 bits com a codificação inicial, final e sempre ingênua (sem melhor ou pior caso)
- 740 032 bits com a codificação delta inteligente, na pior das hipóteses
Se você usar a codificação ingênua como linha de base, isso significa uma economia de até 81,25% ou um custo até 15,625% maior.
Dependendo de como seus valores são distribuídos, essas economias são significativas. Conheça o domínio da sua empresa! Saiba o que você deseja codificar.
Como extensão, você também pode alterar o viés. Se você analisar os dados e identificar grupos de valores, poderá classificá-los em intervalos e codificar cada um deles separadamente, com seu próprio viés. Isso significa que você pode aplicar essa técnica não apenas a intervalos agrupados em torno de um único valor inicial, mas também a intervalos agrupados em torno de vários valores.
Se seus pontos de partida são distribuídos igualmente, essa codificação não funciona muito bem.
Essa codificação é obviamente extremamente ruim para indexar. Você não pode simplesmente ler o valor x-ésimo. Só pode ser lido apenas sequencialmente. O que é apropriado em algumas situações, por exemplo, streaming na rede ou armazenamento em massa (por exemplo, em fita ou HD).
Avaliar os dados, agrupá-los e escolher o viés correto pode ser um trabalho substancial e pode exigir algum ajuste fino para obter melhores resultados.