3.1.1.5. Repeat Offsets (Offset ripetuti)
Come descritto sopra, i primi tre valori definiscono gli offset ripetuti; li chiamiamo Repeated_Offset1, Repeated_Offset2 e Repeated_Offset3. Sono ordinati per recenza, con Repeated_Offset1 che rappresenta "il più recente".
Se offset_value è 1, l'offset utilizzato è Repeated_Offset1, e così via.
C'è un'eccezione: quando la literals_length della sequenza corrente è 0, gli offset ripetuti vengono spostati di 1, quindi:
- offset_value di 1 significa Repeated_Offset2
- offset_value di 2 significa Repeated_Offset3
- offset_value di 3 significa Repeated_Offset1 - 1_byte
Inizializzazione
Per il primo blocco, la cronologia degli offset iniziali viene riempita con i seguenti valori:
- Repeated_Offset1 = 1
- Repeated_Offset2 = 4
- Repeated_Offset3 = 8
A meno che non venga utilizzato un dizionario, nel qual caso provengono dal dizionario.
Quindi ogni blocco ottiene la sua cronologia degli offset iniziali dai valori finali del Compressed_Block più recente. Si noti che i blocchi che non sono Compressed_Blocks vengono saltati; non influenzano la cronologia degli offset.
Regole di aggiornamento
Durante l'esecuzione delle sequenze di un Compressed_Block, i valori dei Repeated_Offsets vengono mantenuti aggiornati in modo che rappresentino sempre i tre offset utilizzati più di recente. Per ottenere ciò, vengono aggiornati dopo l'esecuzione di ogni sequenza nel modo seguente:
Caso 1: Offset non ripetuto
Quando l'offset_value della sequenza non fa riferimento a uno dei Repeated_Offsets (quando ha un valore maggiore di 3, o quando ha il valore 3 e la literals_length della sequenza è zero):
- I valori dei Repeated_Offsets vengono spostati indietro di uno
- Repeated_Offset1 assume il valore dell'offset appena utilizzato
Formula di aggiornamento:
Repeated_Offset3 = Repeated_Offset2
Repeated_Offset2 = Repeated_Offset1
Repeated_Offset1 = nuovo offset
Caso 2: Offset ripetuto
Quando l'offset_value della sequenza fa riferimento a uno dei Repeated_Offsets (quando ha il valore 1 o 2, o quando ha il valore 3 e la literals_length della sequenza è diversa da zero):
- I Repeated_Offsets vengono riordinati
- Repeated_Offset1 assume il valore del Repeated_Offset utilizzato
- I valori esistenti vengono respinti dal primo Repeated_Offset al Repeated_Offset selezionato da offset_value
Questo effettua efficacemente una rotazione avvolgente a un passo di questi valori di offset, in modo che il loro ordine rifletta nuovamente la loro recenza di utilizzo.
Tabella di esempio di aggiornamento
La seguente tabella mostra i valori quando si applica una serie di sequenze ai Repeated_Offsets:
| offset_value | literals_length | Repeated_Offset1 | Repeated_Offset2 | Repeated_Offset3 | Comment (Commento) |
|---|---|---|---|---|---|
| - | - | 1 | 4 | 8 | Valore iniziale |
| 1114 | 11 | 1111 | 1 | 4 | Non-ripetizione |
| 1 | 22 | 1111 | 1 | 4 | Ripetizione1; nessun cambiamento |
| 2225 | 22 | 2222 | 1111 | 1 | Non-ripetizione |
| 1114 | 111 | 1111 | 2222 | 1111 | Non-ripetizione |
| 3336 | 33 | 3333 | 1111 | 2222 | Non-ripetizione |
| 2 | 22 | 1111 | 3333 | 2222 | Ripetizione2; scambio 1 e 2 |
| 3 | 33 | 2222 | 1111 | 3333 | Ripetizione3; rotazione 3 a 1 |
| 1 | 0 | 2221 | 2222 | 1111 | Offset analizzato inserito |
| 1 | 0 | 2222 | 2221 | 3333 | Ripetizione2 |
Tabella 18: Repeated_Offsets
Gestione dei casi speciali
Caso literals_length = 0
Quando literals_length = 0, l'interpretazione di offset_value si sposta:
| offset_value | Offset effettivamente utilizzato |
|---|---|
| 1 | Repeated_Offset2 |
| 2 | Repeated_Offset3 |
| 3 | Repeated_Offset1 - 1 |
Questo trattamento speciale è destinato a ottimizzare le operazioni di copia di corrispondenza consecutive.
Punti chiave
- Principio di recenza: Repeated_Offset1 è sempre l'offset utilizzato più di recente
- Aggiornamento automatico: La cronologia degli offset viene aggiornata automaticamente dopo ogni esecuzione di sequenza
- Supporto dizionario: I valori iniziali possono provenire dal dizionario
- Spostamento speciale: L'interpretazione dell'offset cambia quando literals_length=0