Estoy leyendo el artículo NJ Larsson, A. Moffat: Offline Dictionary-Based Compression , que describe un algoritmo de compresión que, si lo entiendo correctamente, es bastante similar a la codificación de pares de bytes .
Dada una cuerda de longitud , estoy tratando de entender cómo se puede comprimir en tiempo lineal, , con este método de compresión. ¿Cómo se hace esto exactamente? He leído el documento, pero todavía no entiendo cómo logran el tiempo lineal, por lo que tal vez lo entendería explicado de una manera diferente.
Mi primera confusión surge en el primer paso en el algoritmo, donde encontramos que el par más común, por ejemplo, en abcababcabc
el par más común ab
sería reemplazado por un nuevo símbolo, digamos XcXXcXc
. No entiendo cómo podemos encontrar el par más común lo suficientemente rápido. Mi enfoque ingenuo sería mirar primero el primer par ab
y luego contar el número de ocurrencias, luego mirar el siguiente par bc
y contar el número de ocurrencias, etc. Sin embargo, esto ya daría solo para encontrar el par más común una vez .
A continuación, incluso si entendiera cómo encontrar el par más común en el tiempo . Mi siguiente problema es que, ¿no tenemos que encontrar el par más común hasta veces? ¿Y por lo tanto esto daría un tiempo total de ?