Zum Hauptinhalt springen

3.1.1.5. Repeat Offsets (Wiederholungsoffsets)

Wie oben beschrieben, definieren die ersten drei Werte Wiederholungsoffsets; wir bezeichnen sie als Repeated_Offset1, Repeated_Offset2 und Repeated_Offset3. Sie sind nach Aktualität geordnet, wobei Repeated_Offset1 "den neuesten" darstellt.

Wenn offset_value 1 ist, ist der verwendete Offset Repeated_Offset1, und so weiter.

Es gibt eine Ausnahme: Wenn die literals_length der aktuellen Sequenz 0 ist, werden die Wiederholungsoffsets um 1 verschoben, daher:

  • offset_value von 1 bedeutet Repeated_Offset2
  • offset_value von 2 bedeutet Repeated_Offset3
  • offset_value von 3 bedeutet Repeated_Offset1 - 1_byte

Initialisierung

Für den ersten Block wird die Start-Offset-Historie mit folgenden Werten gefüllt:

  • Repeated_Offset1 = 1
  • Repeated_Offset2 = 4
  • Repeated_Offset3 = 8

Es sei denn, ein Wörterbuch wird verwendet, in diesem Fall stammen sie aus dem Wörterbuch.

Dann erhält jeder Block seine Start-Offset-Historie aus den Endwerten des neuesten Compressed_Block. Beachten Sie, dass Blöcke, die keine Compressed_Blocks sind, übersprungen werden; sie beeinflussen die Offset-Historie nicht.

Aktualisierungsregeln

Während der Ausführung der Sequenzen eines Compressed_Block werden die Werte der Repeated_Offsets aktuell gehalten, sodass sie immer die drei zuletzt verwendeten Offsets darstellen. Um dies zu erreichen, werden sie nach Ausführung jeder Sequenz wie folgt aktualisiert:

Fall 1: Nicht-Wiederholungsoffset

Wenn der offset_value der Sequenz nicht auf einen der Repeated_Offsets verweist (wenn er einen Wert größer als 3 hat oder wenn er den Wert 3 hat und die literals_length der Sequenz Null ist):

  • Die Werte der Repeated_Offsets werden um eins nach hinten verschoben
  • Repeated_Offset1 nimmt den Wert des gerade verwendeten Offsets an

Aktualisierungsformel:

Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = neuer Offset

Fall 2: Wiederholungsoffset

Wenn der offset_value der Sequenz auf einen der Repeated_Offsets verweist (wenn er den Wert 1 oder 2 hat, oder wenn er den Wert 3 hat und die literals_length der Sequenz nicht null ist):

  • Die Repeated_Offsets werden neu geordnet
  • Repeated_Offset1 nimmt den Wert des verwendeten Repeated_Offset an
  • Vorhandene Werte werden vom ersten Repeated_Offset zurück zum vom offset_value gewählten Repeated_Offset verschoben

Dies führt effektiv eine einstufige Umhülldrehung dieser Offset-Werte durch, sodass ihre Reihenfolge wieder ihre Aktualität der Verwendung widerspiegelt.

Aktualisierungsbeispieltabelle

Die folgende Tabelle zeigt die Werte bei Anwendung einer Reihe von Sequenzen auf Repeated_Offsets:

offset_valueliterals_lengthRepeated_Offset1Repeated_Offset2Repeated_Offset3Comment (Kommentar)
--148Startwert
111411111114Nicht-Wiederholung
122111114Wiederholung1; keine Änderung
222522222211111Nicht-Wiederholung
1114111111122221111Nicht-Wiederholung
333633333311112222Nicht-Wiederholung
222111133332222Wiederholung2; Tausch 1 und 2
333222211113333Wiederholung3; Rotation 3 zu 1
10222122221111Eingefügter analysierter Offset
10222222213333Wiederholung2

Tabelle 18: Repeated_Offsets

Sonderfallbehandlung

Fall literals_length = 0

Wenn literals_length = 0 ist, verschiebt sich die Interpretation von offset_value:

offset_valueTatsächlich verwendeter Offset
1Repeated_Offset2
2Repeated_Offset3
3Repeated_Offset1 - 1

Diese Sonderbehandlung dient der Optimierung aufeinanderfolgender Übereinstimmungskopiervorgänge.


Wichtige Erkenntnisse

  1. Aktualitätsprinzip: Repeated_Offset1 ist immer der zuletzt verwendete Offset
  2. Automatische Aktualisierung: Offset-Historie wird nach jeder Sequenzausführung automatisch aktualisiert
  3. Wörterbuchunterstützung: Anfangswerte können aus dem Wörterbuch stammen
  4. Spezialverschiebung: Offset-Interpretation verschiebt sich, wenn literals_length=0