# Lempel–Ziv–Oberhumer

Lempel–Ziv–Oberhumer (LZO) és un algorisme de compressió de dades sense pèrdues que se centra en la velocitat de descompressió.

## Disseny

La implementació original "lzop", publicada el 1996, va ser desenvolupada per Markus Franz Xaver Johannes Oberhumer, basant-se en algorismes anteriors d'Abraham Lempel i Jacob Ziv. La biblioteca LZO implementa una sèrie d'algorismes amb les característiques següents:
* Velocitat de compressió més alta en comparació amb la compressió DEFLATE
* Descompressió molt ràpida
* Requereix un buffer addicional durant la compressió (de mida 8 kB o 64 kB, depenent del nivell de compressió)
* No requereix memòria addicional per a la descompressió que no sigui els buffers d'origen i de destinació
* Permet a l'usuari ajustar l'equilibri entre la relació de compressió i la velocitat de compressió, sense afectar la velocitat de descompressió
LZO admet compressió superposada i descompressió in situ. Com a algorisme de compressió de blocs, comprimeix i descomprimeix blocs de dades. La mida del bloc ha de ser la mateixa per a la compressió i la descompressió. LZO comprimeix un bloc de dades en coincidències (un diccionari lliscant) i execucions de literals que no coincideixen per produir bons resultats en dades altament redundants i tracta de manera acceptable amb dades no compressibles, ampliant només les dades incompressibles en un màxim d'1/64 quan es mesura sobre una mida de bloc d'almenys 1 kB.

## Implementacions

La implementació de referència està escrita en ANSI C i s'ha posat a disposició com a programari lliure sota la Llicència Pública General de GNU. Els drets d'autor del codi són propietat de Markus FXJ Oberhumer. Es va publicar originalment l'any 1996. Oberhumer també ha escrit una interfície de línia d'ordres anomenada lzop.
Les versions de LZO estan disponibles per als llenguatges Perl, Python i Java. S'informa que diverses implementacions de LZO funcionen amb Win32, AIX, ConvexOS, IRIX, Mac OS, Palm OS, PlayStation, Nintendo 64, Wii, Solaris, SunOS, TOS (Atari ST), Linux i VxWorks.
La biblioteca libavutil de FFmpeg inclou la seva pròpia implementació de LZO com un possible mètode per a la compressió de vídeo sense pèrdues. La implementació del descompressor de FFmpeg també s'utilitza a OpenConnect per donar suport als paquets ESP comprimits amb LZO enviats pels servidors Juniper Networks i Pulse Secure VPN.
El nucli de Linux utilitza la seva implementació LZO en algunes de les seves característiques:
* btrfs utilitza LZO com a possible mètode de compressió per a la compressió del sistema de fitxers.
* initrd i initramfs utilitzen LZO com a possible mètode de compressió per a la compressió inicial de la unitat RAM.
* SquashFS utilitza LZO com a possible mètode de compressió per a la compressió del sistema de fitxers.
* zram utilitza LZO amb una codificació de longitud d'execució anomenadaLZO-RLEcom a mètode de compressió predeterminat per a la compressió de la unitat RAM.
* zswap utilitza LZO com a mètode de compressió predeterminat per a la compressió de memòria virtual

## Referències

* ↑ Arnaud Bouche. «LZO fast compress/uncompress: implementation in 80386 machine code for Delphi» (en anglès). bouchez.info. LZO, 01-01-2008. [Consulta: 23 agost 2022].
* ↑ Tarreau, Willy. «LZO stream format as understood by Linux's LZO decompressor» (en anglès). infradead.org. Infra Dead, 19-07-2014. [Consulta: 23 agost 2022].
* ↑ Reimar Döffinger. «libavutil/lzo.c» (en anglès). FFmpeg.
* ↑ David Woodhouse. «Add LZO decompression support» (en anglès). OpenConnect, 26-01-2015.