Xấp xỉ độ phức tạp Kolmogorov


22

Tôi đã nghiên cứu một vài điều về Độ phức tạp Kolmogorov , đọc một số bài báo và sách từ Vitanyi và Li và sử dụng khái niệm Khoảng cách nén chuẩn hóa để xác minh mức độ của các tác giả (xác định cách mỗi tác giả viết một số tài liệu văn bản và nhóm bằng cách tương tự).

Trong trường hợp đó, máy nén dữ liệu đã được sử dụng để ước tính độ phức tạp Kolmogorov, vì máy nén dữ liệu có thể được sử dụng làm Máy Turing.

Bên cạnh việc nén dữ liệu và ngôn ngữ lập trình (trong đó bạn sẽ viết một số loại máy nén), còn có thể sử dụng cái gì khác để ước tính độ phức tạp Kolmogorov? Có cách tiếp cận nào khác có thể được sử dụng?


Tôi không chắc là tôi hiểu câu hỏi của bạn: Định nghĩa về KC liên quan đến các máy turing, trong đó các chương trình tạo thành các ví dụ (đối với một số bản dịch). Điều đó có nghĩa gì khi tính gần đúng độ phức tạp Kolmogorv "không có ngôn ngữ lập trình"?
cody

1
Nén một chuỗi bằng bất kỳ phần mềm nén nào, như GZip. Kích thước của đầu ra là một giới hạn trên với KC của chuỗi.
M. Alaggan

@cody: chính xác, tôi đã sử dụng máy nén dữ liệu trong nghiên cứu của mình (zip, bzip, ppmd) để ước tính KC. Chính xác, máy nén dữ liệu không phải là chương trình .. Vì vậy, tôi đang tìm kiếm đề xuất về những gì có thể được sử dụng trong KC ngoài các ngôn ngữ (= viết chương trình bằng C / prolog / sao cũng được) và máy nén dữ liệu (= sử dụng zip, gzip, ppmc, ppmd ...) :)
woliveirajr

1
Tôi đoán có vẻ như với tôi rằng định nghĩa của chương trình nén dữ liệu là chính xác: một chương trình xấp xỉ KC của một chuỗi bởi một chương trình ("bộ giải nén") và một chuỗi khác (chuỗi nén).
cody

Câu trả lời:


9

Tôi đoán một câu trả lời tốt câu hỏi của bạn là: Hãy tạo số giả ngẫu . Cố gắng chọn một máy phát điện trong đó có một số mạnh mẽ các cuộc tấn công chống lại nó: một cuộc tấn công bộ tạo số ngẫu nhiên cho G là (cho mục đích của chúng tôi), một thuật toán A mà khi đưa ra một chuỗi imput s , xác định một hạt Một ( s ) , sao cho G ( A ( s ) ) = s . Sau đó, gần đúng KC của s :GGAs A(s)G(A(s))=ss

input: s
Compute A(s);
if |A(s)| + |G| > |s| output: |s|
otherwise output: |A(s)| + |G|

Ở đâu là độ dài của chương trình tính G ( s ) (thường khá ngắn, như đối với các máy phát tuyến tính).|G|G(s)

Lưu ý rằng trong thực tế, các cuộc tấn công tạo số ngẫu nhiên không như mô tả: chúng có thể thất bại hoặc tạo ra kết quả không đầy đủ. Trong trường hợp đó, bạn có thể điều chỉnh thuật toán để nó trả về khi kết quả của cuộc tấn công là không đạt yêu cầu. Nhận xét tương tự dành cho các thuật toán nén.|s|

Thông báo trước để phương pháp này như trái ngược với các thuật toán nén là các thuật toán nén là nói chung nhiều hơn phù hợp với tính toán KC khi chúng được thiết kế để làm việc trên bất kỳ chuỗi, trong khi một cuộc tấn công có thể làm việc chỉ khi sẽ xảy ra là trong hình ảnh của G ( rất khó xảy ra ).sG


7

p(x)logp(x)

Đây là lý do tại sao độ phức tạp Kolmogorov rất thú vị, không phải vì đó là thuật toán nén cuối cùng (dù sao cũng quan tâm đến việc nén), mà bởi vì đó là thuật toán học tập cuối cùng . Nén và học về cơ bản là giống nhau: tìm mẫu trong dữ liệu của bạn. Khung thống kê được xây dựng trên ý tưởng này được gọi là Chiều dài mô tả tối thiểu và nó được lấy cảm hứng trực tiếp từ độ phức tạp Kolmogorov.

Xem thêm câu hỏi này tại StackExchange cstheory.


5

mã hóa ngữ pháp là một phiên bản ít được sử dụng của thuật toán nén và có thể được coi là một ước tính "thô" về độ phức tạp Kolmogorov. mã hóa ngữ pháp không được sử dụng phổ biến như một thuật toán nén như các cách tiếp cận phổ biến khác có thể chủ yếu là do nó không cải thiện nhiều về nén từ ví dụ Lempel-Ziv trên các văn bản dựa trên văn bản, nhưng nó có thể làm tốt trên các loại dữ liệu khác. ý tưởng là "nén" một chuỗi bằng các quy tắc ngữ pháp. một dẫn xuất ngữ pháp có thể dẫn đến một DAG (so với một cây ít phức tạp hơn) do đó có thể có độ phức tạp đại diện đáng kể.

một lựa chọn khác là tìm các mạch nhỏ nhất / tối thiểu đại diện cho một chuỗi nhưng điều này được biết là có độ phức tạp tính toán rất cao và chỉ có thể thành công trên các chuỗi nhỏ.

K(x)

K(x)

Ngoài ra còn có các phương pháp thuật toán nén khác bên cạnh các cách tiếp cận kiểu "mã hóa chiều dài chạy" của Lempel-Ziv, ví dụ đại số vectơ và SVD có thể được sử dụng làm thuật toán nén. Ngoài ra, các biến đổi Fourier thường được sử dụng để nén hình ảnh, ví dụ như trong tiêu chuẩn JPG.


1
K(x)

Tuy nhiên, các thuật toán tổn thất thường có một tham số có thể điều chỉnh xác định "mức độ tổn thất" và về mặt lý thuyết có thể đạt được mức độ tổn thất với đủ "thuật ngữ" hoặc "tần số" để nói, và nó cũng phụ thuộc vào các mẫu đầu vào, do đó giá trị tham số tổn thất sẽ phụ thuộc về "thứ tự tương đối so với tính ngẫu nhiên" của chúng được nhìn qua "thấu kính" của thuật toán nén ...
vzn

1
@cody và vzn: Cảm ơn câu trả lời, bạn đã cho tôi một số ý tưởng hay cho tiến sĩ của tôi về nén không mất x :)
woliveirajr

JPEG sử dụng DCT, không phải DFT.
Ác quỷ
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.