La codificación unaria , [nb 1] o sistema de numeración unario y también a veces llamado código 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 ), generalmente n unos seguidos de un cero (si se entiende por número natural un entero no negativo ) o con n − 1 unos seguidos de un cero (si se entiende por número natural un entero estrictamente positivo ). Por ejemplo, 5 se representa como 111110 o 11110. Algunas representaciones utilizan n o n − 1 ceros seguidos de un uno. Los unos y los ceros son intercambiables sin pérdida de generalidad . La codificación unaria es a la vez un código sin prefijo y un código autosincronizado .
La codificación unaria es una codificación óptimamente eficiente para la siguiente distribución de probabilidad discreta
para .
En la codificación símbolo por símbolo, es óptimo para cualquier distribución geométrica.
para la cual k ≥ φ = 1,61803398879..., la proporción áurea , o, más generalmente, para cualquier distribución discreta para la cual
para . Aunque es la codificación símbolo por símbolo óptima para tales distribuciones de probabilidad, la codificación Golomb logra una mejor capacidad de compresión para la distribución geométrica porque no considera los 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 distribuciones de probabilidad generales, como en el último caso mencionado anteriormente.
Algunos ejemplos de usos del código unario incluyen:
La codificación unaria se utiliza en los circuitos neuronales responsables de la producción del canto de los pájaros . [1] [2] El núcleo del cerebro de los pájaros cantores que desempeña un papel tanto en el aprendizaje como en la producción del canto de los pájaros es el centro vocal superior (CVS ). Las señales de mando para las diferentes notas del canto de los pájaros emanan de diferentes puntos del CVS. Esta codificación funciona como codificación espacial, que es una estrategia eficiente para los circuitos biológicos debido a su inherente simplicidad y robustez.
Todos los datos binarios se definen por la capacidad de representar números unarios en longitudes de ejecución 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 números enteros estrictamente positivos .
Se garantiza que estos códigos finalizará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 utilizado para el primer bit) mientras se mantienen longitudes de código unario generales y por entero de exactamente N.
A continuación se muestra un ejemplo de códigos unarios decodificables de forma única que no es un código de prefijo y no se puede decodificar instantáneamente (se necesita una mirada anticipada para decodificar).
Estos códigos también permiten (al escribir números enteros sin signo) el uso y transmisión de un bit adicional (el que se utiliza para el primer bit). De esta forma, pueden transmitir 'm' números enteros * N bits unarios y 1 bit adicional de información dentro de m*N bits de datos.
El siguiente conjunto de códigos unarios es simétrico y se puede leer en cualquier dirección. También se puede decodificar instantáneamente en cualquier dirección.
Para los valores unarios en los que se conoce el máximo, se pueden utilizar códigos unarios canónicos que son de naturaleza algo numérica y diferentes de los códigos basados en caracteres. Se empieza con el número '0' o '-1' ( ) y el número máximo de dígitos, y luego, en cada paso, se reduce el número de dígitos en uno y se aumenta o disminuye el resultado en el número '1'.
Los códigos canónicos pueden requerir menos tiempo de procesamiento para decodificarse cuando se procesan como números y no como cadenas. Si la cantidad de códigos necesarios por longitud de símbolo es diferente de 1, es decir, se requieren más códigos no unarios de cierta longitud, esto se lograría aumentando o disminuyendo los valores numéricamente sin reducir la longitud en ese caso.
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. [3] Aquí hay un ejemplo de codificación unaria generalizada para números enteros del 0 al 15 que requiere solo 7 bits (donde se eligen arbitrariamente tres bits en lugar de uno solo en la codificación unaria estándar para mostrar el número). Tenga en cuenta que la representación es cíclica, donde se utilizan marcadores para representar números enteros mayores en ciclos más altos.
La codificación unaria generalizada requiere que el rango de números a representar esté previamente especificado porque este rango determina la cantidad de bits que se necesitan.