Lập trình 22/09/2026 7 phút

Entropy và giới hạn nén: vì sao dữ liệu ngẫu nhiên không thể nén được

Mọi thuật toán nén đều đụng một bức tường toán học: entropy Shannon. Bài này đo thật: chuỗi lặp một ký tự (entropy 0) gzip vụt còn 123 byte từ 90.000; nhưng 90.000 byte ngẫu nhiên (entropy 7.998 bit/byte) gzip làm nó phình lên 90.048 byte — không nén nổi. Và vì sao gzip nén text xuống dưới cả giới hạn entropy order-0: nó khai thác thêm sự lặp lại.

Lập trình 22/09/2026 6 phút

Run-length encoding: thuật toán nén đơn giản nhất, thắng đậm và thua thảm

RLE thay một dãy ký tự lặp bằng cặp (số lần, ký tự) — đơn giản đến mức viết trong vài dòng. Bài này tự cài RLE và đo thật: nó nén chuỗi lặp 90.000 byte còn 708 byte (127x), bitmap còn 93.5x, nhưng làm text tiếng Anh PHÌNH gấp đôi (93.800 thành 184.800 byte). Vì sao — và vì sao RLE vẫn là viên gạch nền của JPEG và nhiều thuật toán hiện đại.

Lập trình 22/09/2026 7 phút

Huffman coding: gán mã ngắn cho ký tự phổ biến, tiến sát giới hạn entropy

Vì sao dùng 8 bit cho mọi ký tự khi 'e' xuất hiện nhiều hơn 'z' hàng trăm lần? Huffman gán mã ngắn cho ký tự phổ biến, mã dài cho ký tự hiếm. Bài này tự cài Huffman bằng heap và đo thật: ký tự phổ biến nhất (khoảng trắng) được mã 2 bit, ký tự hiếm 7 bit; và tổng thể đạt 4.3507 bit/byte — chỉ hơn sàn entropy order-0 (4.3244) đúng 0.026 bit. Vì sao nó không chạm đúng entropy, và arithmetic coding làm gì tốt hơn.

Lập trình 22/09/2026 7 phút

LZ77 và cửa sổ trượt: nén bằng cách trỏ về đoạn đã thấy, không viết lại

Huffman khai thác tần suất nhưng mù với lặp lại. LZ77 lo phần đó: gặp đoạn đã xuất hiện, nó thay bằng tham chiếu ngược (lùi N byte, chép M byte). Bài này tự cài LZ77 và đo thật: trên một đoạn văn lặp câu, một token thay được nguyên 51 byte (distance=49, length=51), 9 tham chiếu nuốt 119/184 byte. Đây là chữ L và Z của gzip, zstd và gần như mọi thuật toán nén hiện đại.

Lập trình 22/09/2026 6 phút

DEFLATE, gzip và zlib: mổ xẻ thuật toán nén phổ biến nhất thế giới

gzip có mặt ở khắp nơi — HTTP, PNG, file .gz — và bên trong nó là DEFLATE: đúng hai thứ ta vừa học, LZ77 chồng lên Huffman. Bài này mổ header gzip thật byte-by-byte (magic 1f 8b, method 08, CRC32, kích thước gốc), so ba lớp vỏ DEFLATE raw / zlib / gzip khác nhau đúng 6 và 18 byte, và chứng minh sức mạnh nằm ở DEFLATE chứ không phải lớp vỏ: gzip level 0 làm dữ liệu to hơn, level 6 nén 153 lần.

Lập trình 22/09/2026 6 phút

Mức nén gzip -1 tới -9: vì sao mặc định -9 thường là lãng phí

Ai cũng từng gõ gzip -9 nghĩ 'nén tối đa'. Nhưng bài này đo thật trên 11MB log: từ gzip -6 lên -9 chỉ nhỏ hơn 7% mà chậm gấp 3.5 lần; zstd còn kịch tính hơn — từ -9 lên -19 nhỏ hơn 17% nhưng chậm gấp 36 lần. Đây là luật lợi ích giảm dần, và cách chọn mức nén theo cách dùng thay vì mặc định lấy mức cao nhất.