Tôi mới bắt đầu đọc một cuốn sách có tên Giới thiệu về nén dữ liệu, của Guy E. Blelloch. Trên trang một, ông nói:
Sự thật là nếu bất kỳ một thông điệp nào được rút ngắn bằng thuật toán, thì một số thông điệp khác cần phải được kéo dài. Bạn có thể xác minh điều này trong thực tế bằng cách chạy GZIP trên tệp GIF. Trên thực tế, có thể đi xa hơn và cho thấy rằng đối với một tập hợp các thông điệp đầu vào có độ dài cố định, nếu một tin nhắn được nén, thì độ dài trung bình của các tin nhắn được nén trên tất cả các đầu vào có thể sẽ luôn dài hơn ban đầu tin nhắn đầu vào.
Hãy xem xét, ví dụ, 8 tin nhắn 3 bit có thể. Nếu một được nén thành hai bit, không khó để thuyết phục bản thân rằng hai tin nhắn sẽ phải mở rộng thành 4 bit, cho trung bình 3 1/8 bit.
Có thật không? Tôi thấy rất khó để thuyết phục bản thân về điều đó. Trong thực tế, đây là một ví dụ truy cập. Hãy xem xét thuật toán chấp nhận đầu vào bất kỳ chuỗi 3 bit nào và ánh xạ tới các đầu ra sau:
000 -> 0
001 -> 001
010 -> 010
011 -> 011
100 -> 100
101 -> 101
110 -> 110
111 -> 111
Vì vậy, có bạn - không có đầu vào được ánh xạ đến một đầu ra dài hơn. Chắc chắn không có "hai tin nhắn" đã mở rộng thành 4 bit.
Vậy chính xác thì tác giả đang nói về cái gì? Tôi nghi ngờ có một số cảnh báo ngầm không rõ ràng đối với tôi, hoặc anh ta đang sử dụng ngôn ngữ quá xa vời.
Tuyên bố miễn trừ trách nhiệm: Tôi nhận ra rằng nếu thuật toán của tôi được áp dụng lặp đi lặp lại, bạn thực sự sẽ mất dữ liệu. Hãy thử áp dụng hai lần cho đầu vào 110: 110 -> 000 -> 0 và bây giờ bạn không biết đầu nào trong số 110 và 000 là đầu vào ban đầu. Tuy nhiên, nếu bạn áp dụng nó chỉ một lần, nó dường như mất mát đối với tôi. Điều đó có liên quan đến những gì tác giả đang nói không?