15.4 Modelos con memoria

Compresor

Sea C[i] la secuencia de los i últimos símbolos codificados y sea p(s|C[i]) la probabilidad de que ocurra el símbolo s tras C[i]. Sea k el orden de predicción (el número máximo de símbolos recordados).

  1. Crear un modelo vacío (excepto por el símbolo ESC) para cada posible contexto donde i 0 y un modelo no vacío para i = -1.
  2. Mientras existan símbolos que codificar:
    1. s siguiente símbolo.
    2. i k (excepto en la primera iteración donde i 0).
    3. Mientras p(s|C[i]) = 0 (s es la primera vez que aparece tras c[i]):
      1. Codificar ESC según p(ESC|C[i]).
      2. Añadir s al contexto para C[i].
      3. i i - 1.
    4. Codificar s según p(s|C[i]). Todos los símbolos que estaban en contextos de orden mayor que i deben ser excluidos del contexto actual ya que es seguro que s no es ninguno de ellos.
    5. Actualizar p(s|C[i]).

Ejemplo

Entrada Salida Prob. de la Salida Contextos Afectados




a cM[C[0]](ESC)cM[C[-1]](a) 1 1 1(r + 1) M[C[0]] = {ESC,1 a,1}
b cM[a](ESC)cM[C[0]](ESC)cM[C[-1]](b) 1 12 1∕r M[a] = {ESC,1 b,1},
  M[c[0]] = {ESC,1 a,1 b,1}
a cM[b](ESC)cM[C[0]](a) 1 13 M[b] = {ESC,1 a,1},
  M[C[0]] = {ESC,1 a,2 b,1}
b cM[a](b) 12 M[C[a]] = {ESC,1 b,2}
c cM[b](ESC)cM[C[0]](ESC)cM[C[-1]](c) 12 14 1(r - 1) M[b] = {ESC,1 a,1 c,1},
  M[C[0]] = {ESC,1 a,2 b,1 c,1}
b cM[c](ESC)cM[C[0]](b) 1 15 M[c] = {ESC,1 b,1},
  M[C[0]] = {ESC,1 a,2 b,2 c,1}
a cM[b](a) 13 M[b] = {ESC,1 a,2 c,1}
b cM[a](b) 23 M[a] = {ESC,1 b,3}
a cM[b](a) 24 M[b] = {ESC,1 a,3 c,1}
b cM[a](b) 34 M[a] = {ESC,1 b,4}
a cM[b](a) 35 M[b] = {ESC,1 a,4 c,1}
a cM[a](ESC)cM[C[0]](a) 15 24 M[a] = {ESC,1 a,1} b,4,
  M[C[0]] = {ESC,1 a,3 b,2 c,1}
a cM[a](a) 16 M[a] = {ESC,1 a,2} b,4
a cM[a](a) 27 M[a] = {ESC,1 a,3 b,4}
a cM[a](a) 38 M[a] = {ESC,1 a,4 b,4}
a cM[a](a) 49 M[a] = {ESC,1 a,5 b,4}
a cM[a](a) 510 M[a] = {ESC,1 a,6 b,4}

Descompresor

  1. Idem al paso 1 del compresor.
  2. Mientras existan símbolos que descodificar:
    1. i k.
    2. Mientras el símbolo descodificado sea ESC:
      1. i i - 1.
    3. Descodificar s según p(s|c[i]).
    4. Actualizar p(s|c[i]).
    5. Mientras i < k:
      1. i i + 1.
      2. Añadir s al contexto para c[i].