Código de prefijo

Tipo de sistema de código

Un código de prefijo es un tipo de sistema de códigos que se distingue por poseer la "propiedad de prefijo", que requiere que no exista ninguna palabra de código completa en el sistema que sea un prefijo (segmento inicial) de cualquier otra palabra de código en el sistema. Esto es trivialmente cierto para los códigos de longitud fija, por lo que solo es un punto a considerar para los códigos de longitud variable .

Por ejemplo, un código con código {9, 55} tiene la propiedad de prefijo; un código que consiste en {9, 5, 59, 55} no la tiene, porque "5" es un prefijo de "59" y también de "55". Un código de prefijo es un código decodificable de forma única : dada una secuencia completa y precisa, un receptor puede identificar cada palabra sin necesidad de un marcador especial entre las palabras. Sin embargo, hay códigos decodificables de forma única que no son códigos de prefijo; por ejemplo, el reverso de un código de prefijo sigue siendo decodificable de forma única (es un código de sufijo), pero no es necesariamente un código de prefijo.

Los códigos de prefijo también se conocen como códigos sin prefijo , códigos de condición de prefijo y códigos instantáneos . Aunque la codificación de Huffman es solo uno de los muchos algoritmos para derivar códigos de prefijo, los códigos de prefijo también se conocen ampliamente como "códigos de Huffman", incluso cuando el código no fue producido por un algoritmo de Huffman. El término código sin comas a veces también se aplica como sinónimo de códigos sin prefijo [1] [2] pero en la mayoría de los libros y artículos matemáticos (por ejemplo, [3] [4] ) un código sin comas se usa para significar un código autosincronizado , una subclase de códigos de prefijo.

Mediante códigos de prefijo, un mensaje puede transmitirse como una secuencia de palabras de código concatenadas, sin ningún marcador fuera de banda o (alternativamente) marcadores especiales entre palabras para enmarcar las palabras en el mensaje. El receptor puede decodificar el mensaje sin ambigüedades, al buscar y eliminar repetidamente secuencias que formen palabras de código válidas. Esto no es generalmente posible con códigos que carecen de la propiedad de prefijo, por ejemplo {0, 1, 10, 11}: un receptor que lea un "1" al comienzo de una palabra de código no sabría si esa era la palabra de código completa "1", o simplemente el prefijo de la palabra de código "10" o "11"; por lo tanto, la cadena "10" podría interpretarse como una sola palabra de código o como la concatenación de las palabras "1" y "0".

Los códigos Huffman de longitud variable , los códigos de llamada de país , las partes de país y editor de los ISBN , los códigos de sincronización secundaria utilizados en el estándar inalámbrico UMTS W-CDMA 3G y los conjuntos de instrucciones (lenguaje de máquina) de la mayoría de las microarquitecturas de computadora son códigos de prefijo.

Los códigos de prefijo no son códigos de corrección de errores . En la práctica, un mensaje puede comprimirse primero con un código de prefijo y luego codificarse nuevamente con codificación de canal (incluida la corrección de errores) antes de su transmisión.

Para cualquier código decodificable de forma única existe un código de prefijo que tiene la misma longitud de palabra de código. [5] La desigualdad de Kraft caracteriza los conjuntos de longitudes de palabras de código que son posibles en un código decodificable de forma única . [6]

Técnicas

Si cada palabra del código tiene la misma longitud, el código se denomina código de longitud fija o código de bloque (aunque el término código de bloque también se utiliza para códigos de corrección de errores de tamaño fijo en la codificación de canal ). Por ejemplo, las letras ISO 8859-15 siempre tienen una longitud de 8 bits. Las letras UTF-32/UCS-4 siempre tienen una longitud de 32 bits. Las celdas ATM siempre tienen una longitud de 424 bits (53 bytes). Un código de longitud fija de k bits de longitud fija puede codificar hasta símbolos de origen. 2 a {\estilo de visualización 2^{k}}

Un código de longitud fija es necesariamente un código de prefijo. Es posible convertir cualquier código en un código de longitud fija rellenando con símbolos fijos los prefijos más cortos para que coincidan con la longitud de los prefijos más largos. Alternativamente, dichos códigos de relleno pueden emplearse para introducir redundancia que permita la autocorrección y/o sincronización. Sin embargo, las codificaciones de longitud fija son ineficientes en situaciones en las que es mucho más probable que se transmitan algunas palabras que otras.

La codificación binaria truncada es una generalización sencilla de los códigos de longitud fija para tratar casos en los que el número de símbolos n no es una potencia de dos. A los símbolos fuente se les asignan palabras de código de longitud k y k +1, donde k se elige de modo que 2 k < n ≤ 2 k+1 .

La codificación de Huffman es una técnica más sofisticada para construir códigos de prefijo de longitud variable. El algoritmo de codificación de Huffman toma como entrada las frecuencias que deberían tener las palabras de código y construye un código de prefijo que minimiza el promedio ponderado de las longitudes de las palabras de código. (Esto está estrechamente relacionado con la minimización de la entropía). Esta es una forma de compresión de datos sin pérdida basada en la codificación de entropía .

Algunos códigos marcan el final de una palabra de código con un símbolo especial de "coma" (también llamado valor Sentinel ), diferente de los datos normales. [7] Esto es algo análogo a los espacios entre palabras en una oración; marcan dónde termina una palabra y comienza otra. Si cada palabra de código termina en una coma, y ​​la coma no aparece en otra parte de una palabra de código, el código está automáticamente libre de prefijo. Sin embargo, reservar un símbolo completo solo para usarlo como coma puede ser ineficiente, especialmente para idiomas con un pequeño número de símbolos. El código Morse es un ejemplo cotidiano de un código de longitud variable con una coma. Las pausas largas entre letras, y las pausas aún más largas entre palabras, ayudan a las personas a reconocer dónde termina una letra (o palabra) y comienza la siguiente. De manera similar, la codificación de Fibonacci usa un "11" para marcar el final de cada palabra de código.

Los códigos de autosincronización son códigos de prefijo que permiten la sincronización de cuadros .

Un código de sufijo es un conjunto de palabras que no son sufijos de ninguna otra; equivalentemente, un conjunto de palabras que son el reverso de un código de prefijo. Al igual que con un código de prefijo, la representación de una cadena como una concatenación de tales palabras es única. Un código bifijo es un conjunto de palabras que es a la vez un código de prefijo y de sufijo. [8] Un código de prefijo óptimo es un código de prefijo con una longitud media mínima. Es decir, supongamos un alfabeto de n símbolos con probabilidades para un código de prefijo C . Si C' es otro código de prefijo y son las longitudes de las palabras de código de C' , entonces . [9] pag ( A i ) {\displaystyle p(A_{i})} la i " {\displaystyle \lambda '_{i}} i = 1 norte la i pag ( A i ) i = 1 norte la i " pag ( A i ) {\displaystyle \sum _{i=1}^{n}{\lambda _{i}p(A_{i})}\leq \sum _{i=1}^{n}{\lambda '_{i}p(A_{i})}\!}

Códigos de prefijo en uso hoy en día

Algunos ejemplos de códigos de prefijo incluyen:

Técnicas

Las técnicas comúnmente utilizadas para construir códigos de prefijo incluyen los códigos de Huffman y los códigos de Shannon-Fano anteriores , y códigos universales como:

Notas

  1. ^ Norma federal estadounidense 1037C
  2. ^ ATIS Telecom Glossary 2007, archivado desde el original el 8 de julio de 2010 , consultado el 4 de diciembre de 2010
  3. ^ Berstel, Jean; Perrin, Dominique (1985), Teoría de los códigos , Academic Press
  4. ^ Golomb, SW ; Gordon, Basil ; Welch, LR (1958), "Códigos sin comas", Revista canadiense de matemáticas , 10 (2): 202–209, doi : 10.4153/CJM-1958-023-9 , S2CID  124092269
  5. ^ Le Boudec, Jean-Yves, Patrick Thiran y Rüdiger Urbanke. Introducción a las ciencias de la información: entropía, compresión, chiffrement y corrección de errores. PPUR Prensas politécnicas, 2015.
  6. ^ Berstel y otros (2010) pág. 75
  7. ^ A. Jones, J. "Desarrollo de sistemas de control y activación para CMS" (PDF) . Física de altas energías, Laboratorio Blackett, Imperial College, Londres. pág. 70. Archivado desde el original (PDF) el 13 de junio de 2011.
  8. ^ Berstel y otros (2010) pág. 58
  9. ^ Notas de clase de McGill COMP 423
  10. ^ Pike, Rob (3 de abril de 2003). "Historia de UTF-8".
  11. ^ Shevchuk, YV (2018), "Vbinary: revisión de la codificación de enteros de longitud variable" (PDF) , Sistemas de programas: teoría y aplicaciones , 9 (4): 239–252, doi : 10.25209/2079-3316-2018-9-4-239-252

Referencias

  • Códigos, árboles y la propiedad del prefijo por Kona Macphee
Obtenido de "https://es.wikipedia.org/w/index.php?title=Código_de_prefijo&oldid=1248191728"