メインコンテンツまでスキップ

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_valueliterals_lengthRepeated_Offset1Repeated_Offset2Repeated_Offset3Comment (コメント)
--148開始値
111411111114非リピート
122111114リピート1; 変更なし
222522222211111非リピート
1114111111122221111非リピート
333633333311112222非リピート
222111133332222リピート2; 1と2を交換
333222211113333リピート3; 3を1に回転
10222122221111解析されたオフセットを挿入
10222222213333リピート2

表 18: Repeated_Offsets

特殊ケース処理

literals_length = 0 の場合

literals_length = 0 の場合、offset_value の解釈がシフトします:

offset_value実際に使用されるオフセット
1Repeated_Offset2
2Repeated_Offset3
3Repeated_Offset1 - 1

この特別な処理は、連続したマッチコピー操作を最適化するためです。


重要なポイント

  1. 新しさの原則: Repeated_Offset1 は常に最近使用されたオフセットです
  2. 自動更新: オフセット履歴は各シーケンス実行後に自動的に更新されます
  3. 辞書サポート: 初期値は辞書から取得できます
  4. 特別なシフト: literals_length=0 の場合、オフセット解釈がシフトします