Có mức tối đa được biết cho bao nhiêu chuỗi 0 và 1 có thể được nén không?


38

Cách đây rất lâu, tôi đã đọc một bài báo mà một giáo sư thuộc loại nào đó nói rằng trong tương lai chúng ta sẽ có thể nén dữ liệu chỉ còn hai bit (hoặc một cái gì đó tương tự).

Điều này tất nhiên là không chính xác (và có thể là trí nhớ của tôi về những gì anh ấy nói chính xác là không chính xác). Có thể hiểu rằng sẽ không thực tế khi nén bất kỳ chuỗi 0 và 1 nào chỉ bằng hai bit bởi vì (ngay cả khi có thể về mặt kỹ thuật), quá nhiều loại chuỗi khác nhau sẽ nén đến hai bit giống nhau (vì chúng ta chỉ có '01 'và' 10 'để chọn từ).

Dù sao, điều này khiến tôi suy nghĩ về tính khả thi của việc nén một chuỗi độ dài tùy ý là 0 và 1 theo một sơ đồ. Đối với loại chuỗi này, có một mối quan hệ đã biết giữa độ dài chuỗi (tỷ lệ giữa 0 và 1 có lẽ không quan trọng) và nén tối đa?

Nói cách khác, có cách nào để xác định độ dài tối thiểu (nhỏ nhất có thể) mà một chuỗi 0 và 1 có thể được nén là bao nhiêu không?

(Ở đây tôi quan tâm đến việc nén tối đa toán học, không phải là những gì hiện có thể có về mặt kỹ thuật.)


7
Chúng tôi cũng sẽ có '00' và '11' để lựa chọn. Nhưng đối số là như nhau, nếu bạn sử dụng chúng, chỉ có bốn chuỗi khác nhau bạn có thể nén.
RemcoGerlich

3
mathoverflow.net/q/160099/34859 : Xin vui lòng xem ở đây rằng vide nguyên tắc pigeonhole sẽ luôn có một số lượng vô hạn các chuỗi không thể nén được ... Không phân biệt thuật toán được sử dụng. (Xem phần có tiêu đề 'Bối cảnh' trong câu hỏi
ARi

4
Nén phụ thuộc vào kiến ​​thức bạn có về cấu trúc của dữ liệu. Có bài viết này về việc nén các nước cờ cho thấy cách bổ sung kiến ​​thức giúp tăng khả năng nén.
quang phổ

1
Bạn có thể làm rõ: Nén có thể là "mất mát" hoặc "không mất mát" (hoặc một số "lai" có thể sử dụng cả hai). Bạn đang nói về nén tối đa chỉ bằng các phương pháp nén "lossless", hay bạn bao gồm (cho phép) sử dụng các phương thức nén "lossy". Nói cách khác, tôi đoán có 3 khả năng: tìm kiếm "nén tối đa" trong đó (1) dữ liệu phải luôn có thể được giải nén chính xác như trước khi nén, (2) dữ liệu phải có thể được giải nén, nhưng một số "mất" được cho phép (3) không phải là yêu cầu để dữ liệu có thể được giải nén.
Kevin Fegan

Xin chào @KevinFegan, trong trường hợp này, nó phải là tùy chọn 1: "dữ liệu phải luôn có thể được giải nén chính xác như trước khi nén"
x457812

Câu trả lời:


45

Sự phức tạp Kolmogorov là một cách tiếp cận để chính thức hóa toán học này. Thật không may, tính toán độ phức tạp Kolmogorov của một chuỗi là một vấn đề không thể giải quyết được. Xem thêm: Xấp xỉ độ phức tạp Kolmogorov .

Có thể nhận được kết quả tốt hơn nếu bạn phân tích nguồn của chuỗi chứ không phải chính chuỗi . Nói cách khác, thường thì nguồn có thể được mô hình hóa như một quy trình xác suất, theo cách ngẫu nhiên chọn một chuỗi bằng cách nào đó, theo một số phân phối. Entropy của phân phối đó sau đó cho bạn biết nén tốt nhất về mặt toán học (lên đến một số hằng số phụ gia nhỏ).


Về khả năng nén hoàn hảo, bạn cũng có thể quan tâm đến những điều sau đây.


nhưng, nén là một trong những kỹ thuật để ước lượng entropy. Có thể nén và entropy là hai khía cạnh của cùng một thứ không?
Paul Uszak

1
@PaulUszak, vâng, chúng có liên quan rất chặt chẽ với nhau: xem, ví dụ, định lý của Shannon . Nhưng, xin lưu ý: bình luận chỉ nên được sử dụng để đề xuất cải tiến / làm rõ cho bài đăng, không đặt câu hỏi tiếp theo. Để đặt câu hỏi mới, hãy sử dụng liên kết "Đặt câu hỏi" ở phần trên bên phải của trang.
DW

35

Nlog2N

Ngoài ra, trong nhiều trường hợp, chúng tôi không quan tâm đến việc tái thiết chính xác . Điều này được gọi là nén mất dữ liệu và là cách nén nhạc và video. Trong trường hợp này, giới hạn dưới được nêu ở trên không giữ, nhưng bạn có thể đưa ra các giới hạn thấp hơn khác.


1
Nlog2N

27

Đây là một lược đồ đơn giản có thể nén các chuỗi bit tùy ý, với kết quả nhỏ nhất chỉ là một bit:

NẾU chuỗi là một kết hợp giống hệt nhau để ghi bản giao hưởng số 9 của Beethoven, chuyển động thứ tư, ở định dạng AAC được lưu trữ trên ổ cứng máy tính của tôi, thì đầu ra chỉ là một bit '0'.

NẾU chuỗi là bất cứ điều gì khác, thì đầu ra là một bit '1', theo sau là một bản sao giống hệt của chuỗi gốc.

Lược đồ này giảm một đầu vào có thể xuống chính xác một bit và tăng mọi đầu vào khác theo chiều dài. Có một nguyên tắc chung: Nếu thuật toán nén có thể ánh xạ bất kỳ chuỗi đầu vào nào thành chuỗi nén và có một thuật toán giải nén phù hợp ánh xạ bất kỳ chuỗi nén nào trở lại chuỗi gốc và thuật toán nén ánh xạ bất kỳ đầu vào nào thành chuỗi ngắn hơn, sau đó nó phải ánh xạ một số chuỗi đầu vào thành chuỗi dài hơn.


2
Tốt công việc làm cho câu trả lời rõ ràng và rõ ràng. Điều đáng chú ý là điều này tương tự như những gì thuật toán nén tốt cố gắng thực hiện - đối với một miền đầu vào nhất định, hãy thử rút ngắn các loại đầu vào phổ biến nhất, để đổi lấy các đầu vào ít phổ biến hơn được kéo dài.
JBentley

6

Đối với mọi sơ đồ nén mà bạn có thể đưa ra, có thể tạo ra dữ liệu sẽ không bị nén bởi nó. Vì vậy, ngay cả khi sơ đồ nén của bạn rất hiệu quả với một số loại dữ liệu, nó sẽ không bao giờ nén theo một tỷ lệ nhất định.

Cách tạo ra một ví dụ về dữ liệu không nén được cho một thuật toán nén cụ thể rất đơn giản: lấy bất kỳ loại dữ liệu nào và chạy nó thông qua thuật toán nén nhiều lần, cho đến khi kích thước không còn giảm nữa.

Vì vậy, khả năng nén của một chuỗi bit không thực sự là một hàm theo độ dài của chuỗi, mà là độ phức tạp của nó liên quan đến thuật toán nén.


Chào mừng bạn Lưu ý rằng điều này chỉ áp dụng cho nén không mất dữ liệu. Nén lossy có thể nén tất cả các chuỗi (ít nhất, miễn là bạn chấp nhận thuật toán "Trả về chuỗi rỗng" như một thuật toán nén mất dữ liệu. ;-)).
David Richerby

@DavidR Richby Điều đó đúng, tất nhiên. Nhưng tôi có ấn tượng từ câu hỏi mà OP đã hỏi về nén không mất mát, bởi vì nó không có ý nghĩa gì khi thảo luận về nén tối đa của sơ đồ mất mát; ý tưởng mà bạn có thể đưa nó đến các thái cực không thể sử dụng được vốn có trong khái niệm nén mất mát.
m69 '' lén lút và không mong muốn ''

Vâng, tôi nghĩ đó là một cách giải thích hợp lý.
David Richerby

-2

Có một thuật toán thú vị và hoàn toàn khác nhau được sử dụng bởi các hệ thống sao lưu doanh nghiệp. Ý tưởng là nếu bạn có một công ty có 10.000 máy tính, thì nhiều máy tính trong số này sẽ chứa nhiều tệp giống hệt nhau. Ví dụ, một email được gửi cho mọi người trong công ty có thể sẽ trở thành một tệp giống hệt nhau trên mỗi ổ cứng.

Vì vậy, một hệ thống sao lưu đang cố gắng sao lưu một tệp rõ ràng nên cố gắng nén tệp để tiết kiệm dung lượng, nhưng trước tiên hệ thống sao lưu sẽ kiểm tra xem một tệp hoàn toàn giống hệt đã được lưu chưa! Vì vậy, thay vì sao lưu mọi thứ , tất cả những gì hệ thống sao lưu làm là lấy ví dụ rằng bạn có số tệp 1.487.578 trên hệ thống sao lưu trên ổ cứng.

Điều này đặc biệt hiệu quả, ví dụ khi 10.000 người dùng đều có cài đặt hệ điều hành và ứng dụng giống hệt nhau. Đối với người dùng đơn lẻ, nó không hữu ích chút nào.


4
Điều đó thật thú vị nhưng tôi không thấy nó trả lời câu hỏi như thế nào. Câu hỏi yêu cầu giới hạn về nén, không phải là một cuộc thảo luận chung về sao lưu doanh nghiệp.
David Richerby

Điều này được gọi là trùng lặp, và được thực hiện bằng cách sử dụng băm. Phải mất rất nhiều RAM để lưu trữ băm 128 bit cho mỗi khối trên đĩa. ZFS có thể làm điều này để tạo cơ hội cho một số khối chia sẻ một số không gian lưu trữ sao chép trên ghi. Nhưng loại sự cố nén này (trong đó bạn đang cố nén một tập dữ liệu lớn mà bạn cần truy cập ngẫu nhiên và điều đó thay đổi quá nhanh đối với nén luồng thông thường, nhưng có dự phòng ở cấp độ khối) không liên quan đến câu trả lời này câu hỏi
Peter Cordes
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.