Supongamos primero que la secuencia inicial tiene una longitud fija [matemática] N [/ matemática]. Entonces queremos encontrar [matemática] f (x_ {0} x_ {1} x_ {2}… x_ {N-1}) [/ matemática] tal que [matemática] \ suma de peso (f (x)) [/ matemática] tiene el valor mínimo. Si suponemos que el rango también debe ser una longitud fija, para evitar codificaciones de palabras complicadas que eviten la ambigüedad, entonces podemos ver los tamaños N + 1, N + 2, … y ver cuál nos da un mapeo con el mínimo total peso.
El codominio debe tener entradas [matemáticas] 2 ^ N [/ matemáticas], por lo que podemos elegir que sean las entradas de menor peso de longitud [matemáticas] 2 ^ {N + k} [/ matemáticas]. Entonces, para cada longitud de salida, simplemente sume el peso agregado de los números de menor peso [matemática] 2 ^ N [/ matemática]:
* Todos los ceros: 1 entrada de peso [matemática] N + k [/ matemática]
* Uno: [matemáticas] N + k [/ matemáticas] entradas de peso [matemáticas] N + k-1 + 4 [/ matemáticas]
* Dos: [matemática] {N + k \ elegir 2} [/ matemática] entradas de peso [matemática] N + k-2 + 8 [/ matemática]
etc. Esto es bastante fácil de llevar a cabo en una hoja de cálculo. Si hacemos eso para secuencias de 32 bits obtenemos:
- ¿Cuál es el número de disposición de N personas de diferentes alturas de modo que a lo sumo K de ellas sean visibles desde el frente de la línea? …
- ¿Por qué factorizar números en números primos es un problema difícil?
- ¿Cuál es el objeto matemático más genial que se puede visualizar?
- Experimentos de pensamiento: ¿Cuáles son algunas formas interesantes, no necesariamente viables, de atacar la conjetura de la optimización dinámica?
- ¿Cuál es el propósito de probar el caso base en la inducción matemática?
N + k peso total de los elementos más ligeros 2 ^ 32 33 324581322615 34 317722362376 35 313645269644 36 310689339720 37 310276537480 38 309075705248 39 310330609032 40 310647293584 32 333466421615 [original]
Entonces, en este caso, elegir una longitud de salida de 38 bits nos da la codificación más ligera. En este caso, todas las secuencias de salida tienen entre 0 y 18 unidades. Ahora que tenemos un dominio y un codominio, simplemente elija cualquier asignación arbitraria entre los dos. (Esto puede tomar como máximo 19 GB para almacenar el ejemplo dado, incluso si elegimos el mapeo al azar).
Si queremos hacer esto para secuencias de longitud arbitraria, simplemente podríamos repetir una transformación de longitud fija varias veces. Probablemente obtendrá mejores resultados cuanto mayor sea la “longitud de código” que utilice, a costa de un mapeo más costoso, en el peor de los casos. (Tenga en cuenta que en general no obtuvimos muchos beneficios. Parte de esto se debe a que más de la mitad de las secuencias de entrada ya tienen menos de 18 bits establecidos).
Una función que asigna secuencias de longitud fija a secuencias de longitud variable es más difícil de analizar y es poco probable que proporcione un beneficio mucho mayor, a menos que la entrada venga equipada con una distribución de probabilidad no uniforme, en cuyo caso la codificación Huffman proporcionará un mejor resultado.
Por otro lado, si la entrada tiene una longitud fija pero la salida puede tener una longitud variable (y alguna forma inequívoca de delimitar la secuencia), puede simplemente tomar las palabras de salida de peso mínimo sobre todo N + 1, N + 2, … y construir la codificación de esa manera.