πŸ—œοΈ Compression Algorithms β€” Dari Deflate hingga Zstandard

Semua algoritma kompresi lossless bekerja dengan menghilangkan redundansi statistik. Deflate (zlib/gzip) β€” kombinasi LZ77 + Huffman coding β€” adalah fondasi internet sejak 1993. Zstandard (zstd) β€” dengan Finite State Entropy + dictionary compression β€” adalah penerus modern 3-5Γ— lebih cepat dengan rasio lebih baik. LZMA (7-Zip/xz) mencapai rasio tertinggi dengan Markov chain + range coding. Dokumen ini membedah teori informasi di belakang masing-masing, implementasi konkret, benchmark, dan kasus penggunaan.


1. Klasifikasi Algoritma Kompresi

1.1 Lossless vs Lossy

AspekLossless (Deflate, zstd, LZMA)Lossy (JPEG, MP3, H.264)
Output identik input?βœ… Ya❌ Tidak (tapi β€œcukup mirip”)
Rasio kompresi2-5Γ— (umum), 10-20Γ— (ekstrim)10-100Γ—
MatematikaInformation theory (Shannon)Psychoacoustic/psychovisual modeling
BidangData, executable, textImage, audio, video
Dokumen terkaitCatatan inicodec-architecture-x264-x265-deepdive

1.2 Keluarga Algoritma Lossless

                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  Lossless          β”‚
                    β”‚  Compression       β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β”‚
            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
            β–Ό                β–Ό                β–Ό
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚ Dictionaryβ”‚    β”‚ Entropy      β”‚  β”‚ Context      β”‚
     β”‚ (LZ*)     β”‚    β”‚ (Huffman,    β”‚  β”‚ (PPM, CM)    β”‚
     β”‚           β”‚    β”‚  Arithmetic)  β”‚  β”‚              β”‚
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                 β”‚                 β”‚
          β–Ό                 β–Ό                 β–Ό
     LZ77, LZSS      Huffman, CABAC,     PPMd, PAQ,
     LZMA, LZ4       FSE, ANS            CM (Context Mixing)

Kebanyakan algoritma adalah HYBRID:

  • Deflate = LZ77 + Huffman
  • LZMA = LZ77-like + Range coding + Markov chain
  • zstd = LZ77-like + FSE
  • Brotli = LZ77 + Huffman + Context modeling

2. LZ77 β€” Jantung Dictionary Compression

2.1 Prinsip

LZ77 (Lempel-Ziv 1977) mengganti string berulang dengan pointer ke kemunculan sebelumnya + length:

Input:  "AABABABCABA"
Output: A A B A B A B C A B A
          ^     ^       ^
          β”‚     β”‚        └── (7,3) = ke belakang 7, copy 3: "ABA"
          β”‚     └── (3,3) = ke belakang 3, copy 3: "ABA"
          └── (2,2) = ke belakang 2, copy 2: "AB"

Parameter LZ77:

ParameterDeflateLZMAzstdLZ4
Window size32 KB4 GB32 MB64 KB
Min match length3234
Max match length258∞∞255
Hash chainYaYaYa (hash table)No (hash only)

2.2 Implementasi Sliding Window

// Simplified LZ77 encoding
#define WINDOW_SIZE 32768  // 32 KB (Deflate)
#define MIN_MATCH 3
#define MAX_MATCH 258
 
void lz77_encode(const uint8_t *input, size_t len) {
    // Hash table untuk quick match
    uint32_t hash_table[65536] = {0};  // 3-byte hash β†’ position
 
    for (size_t pos = 0; pos < len; ) {
        // Hash 3 bytes pertama
        uint32_t hash = (input[pos] << 16) | (input[pos+1] << 8) | input[pos+2];
        hash = (hash * HASH_MULT) & 0xFFFF;
 
        int32_t match_pos = hash_table[hash];
        int match_len = 0;
 
        if (match_pos > 0 && (pos - match_pos) <= WINDOW_SIZE) {
            // Coba match β€” extend sebanyak mungkin
            while (input[match_pos + match_len] == input[pos + match_len]
                   && match_len < MAX_MATCH) {
                match_len++;
            }
        }
 
        if (match_len >= MIN_MATCH) {
            // Output: (distance, length) β€” 3 byte: 15 bit distance + 8 bit length
            output_literal_length(match_len - MIN_MATCH);
            output_distance(pos - match_pos - 1);
            pos += match_len;
        } else {
            // Output literal
            output_literal(input[pos]);
            pos++;
        }
 
        // Update hash
        hash_table[hash] = pos;
    }
}

3. Huffman Coding β€” Entropy Coding Optimal

3.1 Prinsip

Huffman coding mengkodekan simbol dengan panjang bit berbanding terbalik dengan frekuensi kemunculan:

SimbolFrekuensiHuffman CodePanjang
A40%01 bit
B25%102 bit
C20%1103 bit
D15%1113 bit

Rata-rata: bit/simbol

Entropi Shannon: bit/simbol

Efisiensi: β€” Huffman mencapai batas teoritis untuk integer-length codes.

3.2 Canonical Huffman (Digunakan di Deflate)

Deflate tidak mengirimkan pohon Huffman β€” ia mengirimkan panjang kode (bit length) untuk setiap simbol, lalu decoder merekonstruksi pohon secara kanonikal:

// Canonical Huffman: kode ditentukan oleh panjang, bukan struktur pohon
// Simbol diurutkan berdasarkan panjang β†’ kode berurutan
// Length:  [A:1, B:2, C:3, D:3]
// Sort:    A(1), B(2), C(3), D(3)
// Kode:    A=0 (1bit), B=10 (2bit), C=110 (3bit), D=111 (3bit)

Ini yang membuat Deflate efisien: hanya butuh ~4 byte overhead untuk setiap blok, bukan pohon utuh.


4. Deflate β€” Tulang Punggung Internet

4.1 Sejarah & Dampak

TahunKejadian
1993P. Deutsch merilis Deflate (RFC 1951). zlib sebagai referensi implementasi
1996PNG mengadopsi Deflate (bukan GIF yang kena paten LZW)
1996HTTP/1.1 menstandarisasi Content-Encoding: gzip
2010-anHampir semua traffic HTTP via gzip
2025zlib dipasang di ~6 miliar device. Mungkin pustaka paling banyak di-deploy sepanjang sejarah

4.2 Format Blok

Deflate membagi data menjadi blok (biasanya 64KB). Setiap blok bisa:

Blok TypeDeskripsiDigunakan untuk
StoredTanpa kompresiData yang sudah random (gambar terenkripsi)
Fixed HuffmanHuffman tree statis (predefined)Data kecil, meminimalkan overhead tabel
Dynamic HuffmanHuffman tree dinamis + LZ77Data biasa β€” biasanya yang paling efisien

4.3 Kinerja & Limitasi

zlib (gzip -6 β€” default):

DataSizeCompressedRatioCompress (MB/s)Decompress (MB/s)
HTML1 KB0.6 KB1.7Γ—25105
JSON100 KB15 KB6.7Γ—35140
Exe1 MB0.5 MB2.0Γ—30120
Silesia202 MB73 MB2.8Γ—26125

Limitasi utama Deflate:

  1. Window 32 KB: Match hanya bisa mencari 32 KB ke belakang β€” tidak bisa mendeteksi redundansi jarak jauh
  2. Huffman optimal untuk integer codes: membuang 0.5-1 bit/detik dari batas Shannon
  3. Hash collision: implementasi zlib hanya menggunakan 3-byte hash β€” false match mengurangi kompresi

5. Zstandard (zstd) β€” Generasi Berikutnya

5.1 Finite State Entropy (FSE)

Zstandard mengganti Huffman dengan FSE (t-distribution / Asymmetric Numeral Systems β€” ANS):

Keuntungan FSE vs Huffman:

  • Fractional bits: FSE bisa encode dengan ~0.01 bit overhead, bukan 1 bit seperti Huffman
  • Throughput: FSE decode ~500 MB/s/core β€” mendekati batas memori bandwidth
  • Near-optimal: FSE mencapai β‰ˆ99.9% dari batas Shannon

5.2 Dictionary Compression

Zstandard mendukung pre-trained dictionary:

# Train dictionary dari sampel data
zstd --train *.json -o json.dict
 
# Compress dengan dictionary
zstd -D json.dict data.json -o data.json.zst

Hasil untuk data JSON kecil (100-500 byte):

Tanpa dictDengan dictPerbaikan
250 byte80 byte3.1Γ— lebih kecil
95 MB/s (decompress)450 MB/s4.7Γ— lebih cepat

Use case: Database log, API responses, source code, konfigurasi β€” semua data dengan struktur berulang.

5.3 Benchmark Komprehensif

Dataset: silesia.tar (202 MB, campuran)

AlgoritmaLevelZiseRasioCompressDecompress
zstd179 MB2.56Γ—357 MB/s421 MB/s
zstd367 MB3.01Γ—118 MB/s385 MB/s
zstd1060 MB3.37Γ—18 MB/s335 MB/s
zstd1955 MB3.67Γ—4 MB/s175 MB/s
zlib (gzip -9)973 MB2.77Γ—26 MB/s125 MB/s
xz945 MB4.49Γ—1.2 MB/s23 MB/s
brotli1152 MB3.88Γ—0.8 MB/s82 MB/s
lz41108 MB1.87Γ—490 MB/s680 MB/s

Insight: zstd level 1 mengalahkan zlib -9 di RASIO (2.56Γ— vs 2.77Γ— β€” hampir sama) dan KECEPATAN (357 vs 26 MB/s β€” 13.7Γ— lebih cepat).


6. LZMA β€” Rasio Tertinggi

6.1 Markov Chain + Range Coding

LZMA (Lempel-Ziv-Markov chain Algorithm) menambahkan:

  1. LZ77-like: Match finding dengan window besar (4 GB teori, praktik ~1 GB)
  2. Context modeling: Markov chain ya memprediksi bit berikutnya berdasarkan context (posisi, literal sebelumnya, state LZ)
  3. Range coding: Arithmetic coding dengan presisi 64-bit β€” lebih efisien dari Huffman
  4. Distance/context adaptive: Algoritma mengadaptasi model berdasarkan jenis data

6.2 7z vs xz

FormatAlgoritmaWindow maxKarakteristik
7zLZMA4 GBRasio tertinggi, fitur enkripsi AES
xzLZMA24 GBStreaming-friendly, digunakan di Linux (tar.xz)
RARLZSS + PPMβ€”Proprietary, recovery record

7. LZ4 & Snappy β€” Real-time Compression

Digunakan untuk kompresi data dalam memori (database, messaging, log):

# LZ4 β€” digunakan di Apache Arrow, RocksDB, Linux kernel (zram)
import lz4.frame
compressed = lz4.frame.compress(data * 100)  # ~2.5 GB/s compress
decompressed = lz4.frame.decompress(compressed)  # ~4.5 GB/s decompress
AlgoritmaCompressDecompressRasioDigunakan di
LZ4 -1490 MB/s680 MB/s1.87Γ—Redis, RocksDB, Kafka, Linux
Snappy350 MB/s550 MB/s1.65Γ—BigTable, Cassandra, MongoDB
Zstd -1357 MB/s421 MB/s2.56Γ—Facebook, AWS, systemd
Brotli -1180 MB/s330 MB/s2.30Γ—HTTP (Chrome, Firefox)

8. Panduan Memilih Algoritma

Use CasePilihanAlasan
HTTP response (API)zstd atau brotliBobot seimbang, CPU modern support
HTTP response (end-user)brotliChrome/Firefox semua support, rasio terbaik
File archiv (backup)xz atau zstd -19Rasio terbaik
Log rotationzstd -33Γ— lebih kecil dari text, 300 MB/s compress
Database compressionLZ4 atau zstd -1Real-time, query tidak melambat
Video/audio archivingLossy codec (H.265, AV1)100-1000Γ— kompresi > LZMA
Firmware/executablezstd β€”ultraRasio + verifikasi SHA-256
Real-time loggingLZ45 Gbps throughput per core

References

  1. P. Deutsch. β€œDEFLATE Compressed Data Format Specification.” RFC 1951 (1996).
  2. P. Deutsch, J. L. Gailly. β€œZLIB Compressed Data Format.” RFC 1950 (1996).
  3. Y. Collet. β€œZstandard β€” Real-time data compression algorithm.” (2015). https://github.com/facebook/zstd
  4. I. Pavlov. β€œLZMA SDK Documentation.” (2001-2025). https://7-zip.org/sdk.html
  5. Y. Collet, C. Turner. β€œFaster and Smaller: Building Better Compression with Zstd.” (2016).
  6. J. Duda. β€œAsymmetric Numeral Systems: Entropy Coding Combining Speed of Huffman Coding with Compression Rate of Arithmetic Coding.” (2013).
  7. D. Huffman. β€œA Method for the Construction of Minimum-Redundancy Codes.” Proceedings of the IRE, 1952.
  8. J. Ziv, A. Lempel. β€œA Universal Algorithm for Sequential Data Compression.” IEEE TIT, 1977.
  9. Y. Collet. β€œUnderstanding Compression Benchmarks.” (2018).
  10. J. L. Gailly, M. Adler. β€œzlib 1.2.x Manual.” (1995-2025).

Koneksi ke Vault

CatatanKoneksi
hierarchy-digital-plumbingΒ§5 Level 4 β€” Kompresi Data
codec-architecture-x264-x265-deepdiveCodec video juga pakai entropy coding (CABAC) β€” sepupu dari Huffman
math-and-algorithmsEntropy, Huffman tree, Markov chain β€” aplikasi langsung teori informasi
encoding-serialization-compression-deepdiveKompresi sebagai tahap akhir dari pipeline encode
http-protocol-deepdiveContent-Encoding: gzip, br, zstd