Không có thuật toán nén có thể nén tất cả các thông điệp đầu vào?


8

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?


13
Mã của bạn không phải là mã. Làm thế nào để bạn có ý định giải mã 00010?

3
Trên thực tế, có một bằng chứng rất đơn giản về thực tế này dựa trên nguyên tắc pigeonhole. vi.wikipedia.org/wiki/ từ
chazisop

Nếu bạn có thể nén mỗi tin nhắn 3 bit thành <= 3 bit, bạn có thể nén tin nhắn dài vô hạn chỉ trong vài bit. ví dụ: nếu đề xuất của bạn hoạt động, thì bạn chỉ có thể xor với giá trị 3 bit xảy ra nhiều nhất, thêm giá trị vào đầu và nén. sau đó cứ lặp đi lặp lại cho đến khi bất kỳ thông điệp nào chỉ mất vài bit.
JarkkoL

Câu trả lời:


16

Những gì bạn đang thiếu là bạn cần xem xét tất cả các bit có kích thước 3 hoặc ít hơn . Đó là: nếu trong sơ đồ nén cho các bit có kích thước 3 hoặc ít hơn, chúng ta nén một trong các chuỗi 3 bit thành chuỗi 2 bit, thì một số chuỗi có kích thước 3 trở xuống sẽ phải mở rộng thành 3 bit trở lên.

Lược đồ nén không mất dữ liệu là một hàm từ các chuỗi bit hữu hạn đến các chuỗi bit hữu hạn là hàm, nghĩa là, nếu C ( x ) = C ( y ) thì x = y , nghĩa là C ( x ) xác định duy nhất x .CC(x)= =C(y)x= =yC(x)x

Xem xét sơ đồ nén tùy ý và đặt S là một tập hợp các chuỗi nhị phân. Chúng tôi có thể bày tỏ như thế nào C hoạt động trên S bằng cách tính tỷ lệ CompressionRatio ( C , S ) = Σ x S l e n g t h ( C ( x ) )CSCS Một tỷ lệ nén nhỏ là tốt. Ví dụ, nếu nó là1/2đó có nghĩa chúng ta có thể trên dây nén trung bình trongS50% sử dụngC.

Tỷ lệ nén(C,S)= =ΣxStôiength(C(x))ΣxStôiength(x).
1/2SC

Nếu chúng tôi cố gắng nén tất cả các chuỗi có độ dài tối đa thì chúng tôi sẽ gặp rắc rối:n

SnCTỷ lệ nén(C,S)1

Vì vậy, sơ đồ nén tốt nhất trên thế giới là chức năng nhận dạng! Chà, chỉ khi chúng ta muốn nén các chuỗi bit ngẫu nhiên . Các chuỗi bit xảy ra trong thực tế khác xa với ngẫu nhiên và thể hiện rất nhiều tính đều đặn. Đây là lý do tại sao nó có ý nghĩa để nén dữ liệu mặc dù định lý trên.


Cảm ơn bạn. Vì vậy, tác giả sai chính tả, phải không? Anh ta nói "tin nhắn có độ dài cố định" và "xem xét 8 tin nhắn 3 bit", nhưng anh ta có nên nói "tin nhắn có độ dài tối đa cố định" và "xem xét 14 vụ lộn xộn có thể có nhiều nhất là 3 bit" không?
Jack M

{0,1}

7

Chỉ là một ghi chú bổ sung cho câu trả lời hay của Andrej:

Bạn cũng có thể xem sự phức tạp của Kolmogorov :

SC(S)S

C(S)SC(S)|S|

Hai định lý cơ bản là:

cSC(S)|S|+cS

nSnC(S)|S|

2nn<n

ΣTôi= =0n-12Tôi= =2n-1<2n


4

Ví dụ của bạn là sai.

Danh sách các giá trị nén của bạn có một số thông tin ẩn thực sự làm cho độ dài trung bình dài hơn 3 bit. Thông tin bổ sung là độ dài của chuỗi đầu ra.

Bằng mắt chúng ta có thể thấy từ bảng của bạn rằng chuỗi đầu ra đầu tiên chỉ dài 1 bit và các chuỗi khác là 3 bit, nhưng bạn đang gian lận nếu bạn không mã hóa rõ ràng thực tế đó. Hãy mã hóa nó bằng cách thêm một bit nữa; 0 sẽ có nghĩa là "length = 1" và 1 sẽ có nghĩa là "length = 3".

Vì vậy, bảng của bạn thực sự trở thành:

000 -> 00
001 -> 1001
010 -> 1010
011 -> 1011
100 -> 1100 
101 -> 1101
110 -> 1110
111 -> 1111

... trung bình tới 3,75 bit.

BIÊN TẬP

Đây là một suy nghĩ lại, minh họa cho cùng một điểm. Đó là một câu hỏi đố vui:

Mã Morse được tạo thành từ chỉ dấu chấm và dấu gạch ngang. Hãy gọi dấu chấm 0 và dấu gạch ngang 1. Tất cả các chữ cái viết hoa được mã hóa không quá bốn bit.

E = . = 0
Q = --.- = 1101

Có 26 chữ cái viết hoa. Nhưng bốn bit chỉ có thể mã hóa 16 giá trị riêng biệt. Chuyện gì đang xảy ra vậy?


Điều này có thực sự cần thiết? Đối với tôi, dường như trong một số trường hợp, việc cho phép ẩn chiều dài là hoàn toàn hợp lý - như nếu bạn có một giao thức trong đó MỌI thông điệp được đi trước với độ dài được mã hóa dưới dạng một từ có độ rộng cố định. Vì nó đi trước mọi tin nhắn, được nén hay không, nó có thể bị bỏ qua. Và bài đăng của Andrej trả lời câu hỏi trong khi cho phép độ dài được ẩn, do đó hạn chế của bạn có vẻ không cần thiết. Tất nhiên vẫn là một điểm tốt để được đưa lên.
Jack M

Trên thực tế, bạn có nghĩ rằng có thể hạn chế của bạn về việc cần mã hóa độ dài một cách rõ ràng tương đương với hạn chế của Andrej về việc cần phải mã hóa tất cả các chuỗi dưới 3 bit không?
Jack M

@JackM: Trong hầu hết các trường hợp, một sơ đồ nén sẽ được sử dụng không chỉ để ánh xạ các phần dữ liệu đơn lẻ sang các phần dữ liệu đơn lẻ khác (hy vọng nhỏ hơn), mà còn để ánh xạ các chuỗi dữ liệu sang các chuỗi dữ liệu khác (hy vọng ngắn hơn) Dữ liệu. Nếu các chuỗi đầu vào là tất cả trong một luồng bao gồm đủ thông tin để chia nhỏ chúng, thì "độ dài đầu vào" sẽ bao gồm tất cả thông tin cần thiết để phân tích đầu vào từ một luồng và "độ dài đầu ra" sẽ bao gồm tất cả thông tin cần thiết cho phân tích đầu ra.
supercat

0

2n+1-1nn+1. Tuy nhiên, nếu nhiều chuỗi sẽ ngắn hơn nhiều so với độ dài tối đa, tuy nhiên, có thể hữu ích khi sử dụng các sơ đồ mã hóa thay thế thêm nhiều hơn một vào độ dài của các chuỗi tối đa, nhưng ít hơn độ dài của các chuỗi ngắn hơn. Do đó, lượng thông tin được truyền tải bằng cách biết độ dài chính xác của một chuỗi phụ thuộc vào thời gian người ta cho rằng chuỗi đó có thể là bao nhiêu và mức độ sẵn sàng của một chuỗi để đệm chuỗi ngắn hơn.

Do các yếu tố như vậy phụ thuộc rất nhiều vào ứng dụng, nên rất hữu ích khi giả định một mô hình tính toán trong đó các chuỗi đầu vào được giả định chứa thông tin đủ để cho người đọc biết chúng kết thúc ở đâu (ngay cả khi chúng được đệm với số lượng dữ liệu tùy ý) và các chuỗi đầu ra được yêu cầu để làm tương tự. Một mô hình tính toán như vậy sẽ cho phép mọi hoạt động hoạt động trên các bản ghi dữ liệu riêng lẻ cũng hoạt động tốt trên bất kỳ chuỗi bản ghi dữ liệu được nối nào [mã sẽ biết khi nào dừng đọc toàn bộ bản ghi không nén có thể được biết là khi nào nên dừng khi biết đọc toàn bộ những cái đã nén].

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.