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_value | literals_length | Repeated_Offset1 | Repeated_Offset2 | Repeated_Offset3 | Comment (Kommentar) |
|---|---|---|---|---|---|
| - | - | 1 | 4 | 8 | Startwert |
| 1114 | 11 | 1111 | 1 | 4 | Nicht-Wiederholung |
| 1 | 22 | 1111 | 1 | 4 | Wiederholung1; keine Änderung |
| 2225 | 22 | 2222 | 1111 | 1 | Nicht-Wiederholung |
| 1114 | 111 | 1111 | 2222 | 1111 | Nicht-Wiederholung |
| 3336 | 33 | 3333 | 1111 | 2222 | Nicht-Wiederholung |
| 2 | 22 | 1111 | 3333 | 2222 | Wiederholung2; Tausch 1 und 2 |
| 3 | 33 | 2222 | 1111 | 3333 | Wiederholung3; Rotation 3 zu 1 |
| 1 | 0 | 2221 | 2222 | 1111 | Eingefügter analysierter Offset |
| 1 | 0 | 2222 | 2221 | 3333 | Wiederholung2 |
Tabelle 18: Repeated_Offsets
Sonderfallbehandlung
Fall literals_length = 0
Wenn literals_length = 0 ist, verschiebt sich die Interpretation von offset_value:
| offset_value | Tatsächlich verwendeter Offset |
|---|---|
| 1 | Repeated_Offset2 |
| 2 | Repeated_Offset3 |
| 3 | Repeated_Offset1 - 1 |
Diese Sonderbehandlung dient der Optimierung aufeinanderfolgender Übereinstimmungskopiervorgänge.
Wichtige Erkenntnisse
- Aktualitätsprinzip: Repeated_Offset1 ist immer der zuletzt verwendete Offset
- Automatische Aktualisierung: Offset-Historie wird nach jeder Sequenzausführung automatisch aktualisiert
- Wörterbuchunterstützung: Anfangswerte können aus dem Wörterbuch stammen
- Spezialverschiebung: Offset-Interpretation verschiebt sich, wenn literals_length=0