Estou lendo o artigo NJ Larsson, A. Moffat: Compactação baseada em dicionário offline , que descreve um algoritmo de compactação que, se bem entendi, é bastante semelhante à codificação de pares de bytes .
Dada uma string de comprimento , estou tentando entender como se pode compactá-la no tempo linear, , com esse método de compactação. Como exatamente isso é feito? Eu li o jornal, mas ainda não entendo como eles atingem o tempo linear, então talvez eu entenda isso explicado de uma maneira diferente.
Minha primeira confusão surge na primeira etapa do algoritmo, onde encontramos o par mais comum, por exemplo, no abcababcabc
par mais comum ab
seria substituído por um novo símbolo, digamos XcXXcXc
. Não entendo como podemos encontrar o par mais comum com rapidez suficiente. Minha abordagem ingênua seria olhar primeiro para o primeiro par ab
e depois contar o número de ocorrências, depois olhar para o próximo par bc
e contar o número de ocorrências etc. No entanto, isso já daria apenas para encontrando o par mais comum uma vez .
A seguir, mesmo que eu entenda como encontrar o par mais comum no tempo . Meu próximo problema é que, não precisamos encontrar o par mais comum até vezes? E, portanto, isso daria um tempo total de ?