¿Cómo construyo un código de afijo óptimo?

8

Un código de afijo es un código que es simultáneamente un código de prefijo y sufijo. Es decir, ninguna palabra de código no es ni el prefijo ni el sufijo de ninguna otra palabra de código. Los códigos de fijación se pueden decodificar instantáneamente en ambas direcciones (hacia adelante y hacia atrás).

Quiero crear uno que comprima de manera óptima una distribución de símbolos de entrada dada, dado un conjunto de símbolos de salida.

El algoritmo de Huffman (que crea códigos de prefijo) se acerca más, pero debido a su codiciosa estrategia, parece inadecuado para modificaciones con este fin.

¿Cómo se pueden encontrar los códigos de afijo óptimos?

Anko
fuente

Respuestas:

4

Realmente no creo que haya un algoritmo conocido para ser óptimo. De hecho, existe una conjetura importante acerca de cuán efectivo puede ser un conjunto de palabras de código, consulte: http://arxiv.org/abs/0709.2598 (el nombre que conocía para el código de afijo es código libre de arreglos). Si se demuestra que un algoritmo es óptimo, lo más probable es que también resuelva (o corrija) esta conjetura.

domotorp
fuente
Estas respuestas parecen sugerir que el algoritmo de Huffman produce códigos óptimos en condiciones razonables.
Anko
No veo cómo esas respuestas están relacionadas con su problema. Si solo usa un algoritmo, puede usar huffman y luego extender algunas malas palabras.
domotorp
Solo estoy señalando que algunos códigos pueden probarse que son óptimos. La extensión de las palabras de código de un código Huffman probablemente lo haría poco óptimo, ya que cada extensión hace que se acerque a una codificación de bloque. ¡Sin embargo, este podría ser un punto de partida!
Anko
1
Pero huffman son libres de prefijos para los cuales conocemos la desigualdad de Kraft ( en.wikipedia.org/wiki/Kraft%27s_inequality ). Si tenemos una prueba de optimización, sigue la desigualdad tipo kraft. Pero para los códigos sin arreglos, el resp. la desigualdad es una conjetura, por lo que no puede haber pruebas.
domotorp
En la página 8, abajo, se describen varios códigos sin corrección para el inglés, y se menciona que ninguno de los algoritmos utilizados para construirlos ha demostrado ser óptimo. Por lo tanto, presumiblemente no se conoce un algoritmo eficiente.
Yuval Filmus
2

FWIW, me parece probable que haya un PTAS para el problema, siguiendo la idea básica de este documento . (Esto no responde exactamente a su pregunta, pero aún describiré el PTAS aquí en la sección de respuestas, ya que es demasiado largo para caber en un comentario).

Arregle cualquier constante . Sea una instancia del problema, es decir, una distribución de probabilidad en .p [ n ]ϵ>0p[n]

Digamos que un código (un conjunto de palabras de código) está libre de -fix si ninguna palabra de código en el código que tiene una longitud o menor es un prefijo o sufijo de otra palabra de código. KKK

K p n SK=1/ϵ2KpnSKKC(S)|S|pSn|S|KSn|S|n|S|SC(S)C0SC0Kp

C0pK

C0(1+O(ϵ))

C0K=1/ϵ(1+ϵ)KKC0KKK1+O(ϵ)C1

C1(1+O(ϵ))C0C0C1(1+O(ϵ))

Neal Young
fuente