3.1.1.5. Repeat Offsets (リピートオフセット)
上記のように、最初の3つの値はリピートオフセットを定義します。これらを Repeated_Offset1、Repeated_Offset2、Repeated_Offset3 と呼びます。これらは新しさの順に並べられており、Repeated_Offset1 は「最も新しいもの」を表します。
offset_value が 1 の場合、使用されるオフセットは Repeated_Offset1 であり、以下同様です。
例外が1つあります: 現在のシーケンスの literals_length が 0 の場合、リピートオフセットは 1 ずれるため:
- offset_value が 1 の場合 Repeated_Offset2 を意味します
- offset_value が 2 の場合 Repeated_Offset3 を意味します
- offset_value が 3 の場合 Repeated_Offset1 - 1_byte を意味します
初期化
最初のブロックの場合、開始オフセット履歴は次の値で埋められます:
- Repeated_Offset1 = 1
- Repeated_Offset2 = 4
- Repeated_Offset3 = 8
辞書が使用される場合を除き、その場合は辞書から取得されます。
その後、各ブロックは最新の Compressed_Block の終了値から開始オフセット履歴を取得します。Compressed_Block でないブロックはスキップされることに注意してください。それらはオフセット履歴に影響しません。
更新ルール
Compressed_Block のシーケンスを実行中、Repeated_Offsets の値は常に最近使用された3つのオフセットを表すように最新の状態に保たれます。これを実現するために、各シーケンスの実行後に次のように更新されます:
ケース 1: 非リピートオフセット
シーケンスの offset_value が Repeated_Offsets のいずれかを参照しない場合 (3 より大きい値を持つ場合、またはシーケンスの literals_length がゼロで値 3 を持つ場合):
- Repeated_Offsets の値は 1 つ後方にシフトされます
- Repeated_Offset1 は、使用されたばかりのオフセットの値を取ります
更新式:
Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = 新しいオフセット
ケース 2: リピートオフセット
シーケンスの offset_value が Repeated_Offsets のいずれかを参照する場合 (値 1 または 2 を持つ場合、またはシーケンスの literals_length が非ゼロで値 3 を持つ場合):
- Repeated_Offsets が再配置されます
- Repeated_Offset1 は使用された Repeated_Offset の値を取ります
- 既存の値は、最初の Repeated_Offset から offset_value で選択された Repeated_Offset まで押し戻されます
これにより、これらのオフセット値の 1 ステップのラップアラウンド回転が効果的に実行され、その順序が再び使用の新しさを反映します。
更新例テーブル
次のテーブルは、Repeated_Offsets に一連のシーケンスを適用するときの値を示しています:
| offset_value | literals_length | Repeated_Offset1 | Repeated_Offset2 | Repeated_Offset3 | Comment (コメント) |
|---|---|---|---|---|---|
| - | - | 1 | 4 | 8 | 開始値 |
| 1114 | 11 | 1111 | 1 | 4 | 非リピート |
| 1 | 22 | 1111 | 1 | 4 | リピート1; 変更なし |
| 2225 | 22 | 2222 | 1111 | 1 | 非リピート |
| 1114 | 111 | 1111 | 2222 | 1111 | 非リピート |
| 3336 | 33 | 3333 | 1111 | 2222 | 非リピート |
| 2 | 22 | 1111 | 3333 | 2222 | リピート2; 1と2を交換 |
| 3 | 33 | 2222 | 1111 | 3333 | リピート3; 3を1に回転 |
| 1 | 0 | 2221 | 2222 | 1111 | 解析されたオフセットを挿入 |
| 1 | 0 | 2222 | 2221 | 3333 | リピート2 |
表 18: Repeated_Offsets
特殊ケース処理
literals_length = 0 の場合
literals_length = 0 の場合、offset_value の解釈がシフトします:
| offset_value | 実際に使用されるオフセット |
|---|---|
| 1 | Repeated_Offset2 |
| 2 | Repeated_Offset3 |
| 3 | Repeated_Offset1 - 1 |
この特別な処理は、連続したマッチコピー操作を最適化するためです。
重要なポイント
- 新しさの原則: Repeated_Offset1 は常に最近使用されたオフセットです
- 自動更新: オフセット履歴は各シーケンス実行後に自動的に更新されます
- 辞書サポート: 初期値は辞書から取得できます
- 特別なシフト: literals_length=0 の場合、オフセット解釈がシフトします