Codificación unaria
La codificación unaria, o el sistema numérico unario y también llamado a veces código de termómetro, es una codificación de entropía que representa un número natural, n, con un código de longitud n + 1 (o n), normalmente n unos seguidos de un cero (si número natural se entiende como entero no negativo) o con n − 1 unos seguidos de cero (si número natural se entiende como entero estrictamente positivo). Por ejemplo, 5 se representa como 111110 o 11110. Algunas representaciones usan n o n − 1 ceros seguidos de un uno. Los unos y ceros son intercambiables sin pérdida de generalidad. La codificación unaria es tanto un código sin prefijos como un código de sincronización automática.
n (no negativo) | n (strictamente positivo) | Código de entrada | Alternativa |
---|---|---|---|
0 | 1 | 0 | 1 |
1 | 2 | 10 | 01 |
2 | 3 | 110 | 001 |
3 | 4 | 1110 | 0001 |
4 | 5 | 11110 | 00001 |
5 | 6 | 111110 | 000001 |
6 | 7 | 1111110 | 0001 |
7 | 8 | 11111110 | 00001 |
8 | 9 | 111111110 | 000001 |
9 | 10 | 1111111110 | 0000001 |
La codificación unaria es una codificación óptimamente eficiente para la siguiente distribución de probabilidad discreta
- P ()n)=2− − n{displaystyle operatorname {P} (n)=2^{-n},}
para n=1,2,3,...{displaystyle n=1,2,3,...}.
En la codificación símbolo por símbolo, es óptimo para cualquier distribución geométrica
- P ()n)=()k− − 1)k− − n{displaystyle operatorname {P} (n)=(k-1)k^{-n},}
para la cual k ≥ φ = 1.61803398879…, la proporción áurea, o, más generalmente, para cualquier distribución discreta para la cual
- P ()n)≥ ≥ P ()n+1)+P ()n+2){displaystyle operatorname {P} (n)geq operatorname {P} (n+1)+operatorname {P} (n+2),}
para n=1,2,3,...{displaystyle n=1,2,3,...}. Aunque es la codificación de símbolo por símbolo óptima para estas distribuciones de probabilidad, la codificación Golomb logra una mejor capacidad de compresión para la distribución geométrica porque no considera símbolos de entrada de forma independiente, sino que agrupa implícitamente las entradas. Por la misma razón, la codificación aritmética funciona mejor para las distribuciones generales de probabilidad, como en el último caso anterior.
Código unario en uso hoy
Ejemplos de usos de código unario incluyen:
- En el código Golomb Rice, se utiliza la codificación no irritable para codificar la parte cociente de la palabra código Golomb.
- En UTF-8, se utiliza una codificación no irritable en el byte líder de una secuencia de varios bytes para indicar el número de bytes en la secuencia para que la longitud de la secuencia pueda determinarse sin examinar los bytes de continuación.
- Las redes neuronales de formación instantánea utilizan códigos no deseados para una representación eficiente de datos.
Codificación unaria en redes biológicas
La codificación unaria se utiliza en los circuitos neuronales responsables de la producción del canto de los pájaros. El núcleo en el cerebro de los pájaros cantores que juega un papel tanto en el aprendizaje como en la producción del canto de los pájaros es el HVC (centro vocal alto). Las señales de comando para diferentes notas en el canto de los pájaros emanan de diferentes puntos en el HVC. Esta codificación funciona como codificación espacial, que es una estrategia eficiente para los circuitos biológicos debido a su simplicidad y robustez inherentes.
Códigos unarios estándar de longitud de ejecución
Todos los datos binarios se definen por la capacidad de representar números unarios en longitudes alternas de 1 y 0. Esto se ajusta a la definición estándar de unario, es decir, N dígitos del mismo número 1 o 0. Todas las longitudes de ejecución, por definición, tienen al menos un dígito y, por lo tanto, representan enteros estrictamente positivos.
n | Código RL | Siguiente código |
---|---|---|
1 | 1 | 0 |
2 | 11 | 00 |
3 | 111 | 000 |
4 | 1111 | 0000 |
5 | 11111 | 00000 |
6 | 111111 | 000 000 |
7 | 1111111 | 0000000 |
8 | 11111111 | 00000000 |
9 | 111111111 | 000 |
10 | 1111111111 | 0000000000 |
... |
Se garantiza que estos códigos terminarán válidamente en cualquier longitud de datos (al leer datos arbitrarios) y en el ciclo de escritura (separado) permiten el uso y la transmisión de un bit adicional (el que se usa para el primer bit) mientras se mantiene longitudes de código unario total y por entero de exactamente N.
Códigos unarios sin prefijo decodificables de forma única
El siguiente es un ejemplo de códigos unarios decodificables de forma única que no es un código de prefijo y no es decodificable instantáneamente (necesita anticipación para decodificar)
n | Código de entrada | Alternativa |
---|---|---|
1 | 1 | 0 |
2 | 10 | 01 |
3 | 100 | 011 |
4 | 1000 | 0111 |
5 | 10000 | 01111 |
6 | 100000 | 011111 |
7 | 1000000 | 0111111 |
8 | 10000000 | 01111111 |
9 | 100000000 | 011111111 |
10 | 1000000 | 0111111111 |
... |
Estos códigos también (al escribir números enteros sin signo) permiten el uso y la transmisión de un bit adicional (el que se usa para el primer bit). Por lo tanto, son capaces de transmitir 'm' enteros * N bits unarios y 1 bit adicional de información dentro de m*N bits de datos.
Códigos unarios simétricos
El siguiente conjunto de códigos unarios son simétricos y se pueden leer en cualquier dirección. También es instantáneamente decodificable en cualquier dirección.
n (strictamente positivo) | Código de entrada | Alternativa | n (no negativo) |
---|---|---|---|
1 | 1 | 0 | 0 |
2 | 00 | 11 | 1 |
3 | 010 | 101 | 2 |
4 | 0110 | 1001 | 3 |
5 | 01110 | 10001 | 4 |
6 | 011110 | 100001 | 5 |
7 | 0111110 | 1000001 | 6 |
8 | 01111110 | 10000001 | 7 |
9 | 011111110 | 100000001 | 8 |
10 | 0111111110 | 1000000001 | 9 |
... |
Códigos unarios canónicos
Para valores inéditos donde se conoce el máximo, se puede utilizar códigos canónicos siniestros que son de naturaleza algo numérica y diferentes de códigos basados en caracteres. Se trata de empezar con '0' numérico o '-1' (2n− − 1{displaystyle operatorname {2}) y el número máximo de dígitos entonces para cada paso reduciendo el número de dígitos por uno y aumentando/disminuir el resultado por numérico '1'.
n | Código de entrada | Alternativa |
---|---|---|
1 | 1 | 0 |
2 | 01 | 10 |
3 | 001 | 110 |
4 | 0001 | 1110 |
5 | 00001 | 11110 |
6 | 000001 | 111110 |
7 | 0001 | 1111110 |
8 | 00001 | 11111110 |
9 | 000001 | 111111110 |
10 | 0000000000 | 1111111111 |
Los códigos canónicos pueden requerir menos tiempo de procesamiento para decodificarse cuando se procesan como números y no como una cadena. Si el número de códigos requeridos por longitud de símbolo es diferente a 1, es decir, se requieren más códigos no unitarios de cierta longitud, estos se lograrían aumentando/disminuyendo los valores numéricamente sin reducir la longitud en ese caso.
Codificación unaria generalizada
Subhash Kak presentó una versión generalizada de la codificación unaria para representar números de manera mucho más eficiente que la codificación unaria estándar. Aquí hay un ejemplo de codificación unaria generalizada para números enteros del 0 al 15 que requiere solo 7 bits (donde tres bits se eligen arbitrariamente en lugar de uno solo en unario estándar para mostrar el número). Tenga en cuenta que la representación es cíclica donde se usan marcadores para representar números enteros más altos en ciclos más altos.
n | Código de entrada | Generalizados no |
---|---|---|
0 | 0 | 0000000 |
1 | 10 | 0000111 |
2 | 110 | 0001110 |
3 | 1110 | 0011100 |
4 | 11110 | 0111000 |
5 | 111110 | 1110000 |
6 | 1111110 | 0010111 |
7 | 11111110 | 0101110 |
8 | 111111110 | 1011100 |
9 | 1111111110 | 0111001 |
10 | 11111111110 | 1110010 |
11 | 111111111110 | 0100111 |
12 | 1111111111110 | 1001110 |
13 | 11111111111110 | 0011101 |
14 | 111111111111110 | 0111010 |
15 | 1111111111111110 | 1110100 |
La codificación unaria generalizada requiere que se especifique previamente el rango de números a representar porque este rango determina el número de bits que se necesitan.
Contenido relacionado
Spl (Unix)
Método de Horner
Matriz de adyacencia
Iteración
Lógica de primer orden