Sự tương đương của định nghĩa độ phức tạp Kolmogorov


20

Có nhiều cách để định nghĩa Độ phức tạp Kolmogorov và thông thường, tất cả các định nghĩa này đều tương đương với hằng số phụ gia. Đó là nếu K 1K1K 2K2 là các hàm phức kolmogorov (được xác định thông qua các ngôn ngữ hoặc mô hình khác nhau), thì tồn tại một hằng số cc sao cho mọi chuỗi xx , | K 1 ( x ) - K 2 ( x ) | < c|K1(x)K2(x)|<c . Tôi tin điều này là bởi vì với mọi hàm phức tạp Kolmogorov KK và với mọi xx nó giữ điều đóK ( x ) | x | + cK(x)|x|+c , với một số hằng số cc .

Tôi quan tâm đến các định nghĩa sau cho KK , dựa trên máy Turing

  1. số trạng thái : Xác định K 1 ( x )K1(x) là số q tối thiểu qsao cho một TM có qq trạng thái xuất ra xx trên chuỗi trống.
  2. K2(x)xMMK 2 ( x ) = phút | M | K2(x)=min|M|M Mxx

Là và tương đương? Mối quan hệ giữa chúng là gì và cái nào nắm bắt tốt hơn khái niệm về độ phức tạp Kolmogorov, nếu chúng không tương đương.K 1 K1K 2K2

Điều đặc biệt làm tôi khó chịu là tốc độ tăng với , dường như không phải là siêu tuyến tính (hoặc ít nhất là tuyến tính với hằng số C> 1 sao cho K_2 <C | x | , thay vì | x | + c ). Hãy xem xét TM đơn giản nhất tạo ra x - cái chỉ mã hóa x là một phần của trạng thái và hàm chuyển tiếp của nó. ngay lập tức thấy rằng K_1 (x) \ le | x | +1 . Tuy nhiên, mã hóa của cùng một máy lớn hơn nhiều và giới hạn tầm thường tôi nhận được là K_2 (x) \ le | x | \ log | x | .K 2K2 x xC > 1 C>1K 2 < C | x | K2<C|x|| x | + C |x|+cx xx xK 1 ( x ) | x | + 1 K1(x)|x|+1K 2 ( x ) | x | đăng nhập | x |K2(x)|x|log|x|


Có nhiều hơn máy có trạng thái và kích thước trung bình của chúng ít nhất là , do đó không chắc là chúng chỉ khác nhau bởi hằng số phụ gia. 2n22n2nnn2n2
Kaveh

1
Có một ràng buộc nổi tiếng làđối với một số cố định không phụ thuộc vào . Điều này là do chúng ta có thể mã hóa thành ngôn ngữ không có tiền tố bằng cách chỉ cần nhân đôi mỗi bit của và sau đó kết thúc bằng . Điều này mất bit để biểu diễn . Do đó, vì được định nghĩa theo thuật ngữ của một máy không có tiền tố phổ quát, cho một số cố định . Điều này có thể được cải thiện một số bằng cách sử dụng một cách thông minh hơn để mã hóa thành ngôn ngữ miễn phí tiền tố. K2(x)c+2|x|K2(x)c+2|x|ccxxxxxx01012|x|+22|x|+2xxK2K2K2(x)2|x|+2+cK2(x)2|x|+2+cccxx
Carl Mummert

Tôi không thể thấy như thế nào. Dường như x được đưa ra như một phần của mã hóa (dưới dạng dữ liệu thô) hoặc bạn phải xây dựng x bằng máy trạng thái của mình. Tùy chọn đầu tiên dường như gian lận và tôi không thấy làm thế nào nó có thể so sánh với tùy chọn thứ hai (ngụ ý K 1 )xxK1
Ran G.

@Ran G.: Điểm mấu chốt là định lý bất biến được mô tả tại en.wikipedia.org/wiki/Invariance_theorem . Nếu tôi có thể mô tả bất kỳ hệ thống hiệu quả nào có tốc độ tăng trưởng là 2 | x | sau đó một máy Turing phổ dụng (như bạn mô tả cho K 2 ) sẽ đáp ứng điều này trong một hằng số phụ gia. Các máy phổ thông là một trong đó có M là đầu vào và trả về đầu ra của M nếu M tạm dừng. 2|x|K2MMM
Carl Mummert

Câu trả lời:


6

Tôi xin lỗi trước vì tôi đã đưa ra quá nhiều chi tiết, nhưng tôi sắp mâu thuẫn với mọi người.

Giới thiệu về K ( x ) K ( x ) + cK(x)K(x)+c

Thực tế là K 1 ( x ) K 2 ( x ) + c thường xuất phát từ một thông dịch của ngôn ngữ mô tả # 2 vào ngôn ngữ mô tả # 1 và không từ một bản dịch từ các chương trình của # 2 vào các chương trình của # 1.K1(x)K2(x)+c

Ví dụ K C ( x ) K P y t h o n ( x ) + c p y 2 c và bạn sẽ có được sự bất bình đẳng này một cách đơn giản như thế này:KC(x)KPython(x)+cpy2c

void py_run(char * s) {
    // code of your Python interpreter
}

int main(void) {
    py_run("Put here your Python program of size Kpython(x)");
}

Sau đó, hằng số c p y 2 c của bạn sẽ giống như 528 + 490240688 trong đó 528 là số bit cho mã này và 490240688 bit là kích thước trình thông dịch Python chính thức được viết bằng C. Tất nhiên bạn chỉ cần diễn giải những gì có thể có trong ngôn ngữ mô tả của bạn cho Python để bạn có thể làm tốt hơn 69 MB :-)cpy2c528+490240688528490240688

Điều quan trọng là bạn có thể viết chương trình Python của bạn một cách tuyến tính trong mã C của bạn. Ví dụ, một ngôn ngữ mà bạn cần đặt "BANANA" giữa mỗi ký tự không phải là một chương trình mô tả rất tốt và thuộc tính đó là sai. (Nhưng nếu ngôn ngữ mô tả cho phép bạn ghi dữ liệu trong một tệp riêng hoặc trong một khối, thì vấn đề này sẽ biến mất)

Tại sao K 1 ( x ) = q của bạn bị thiếu sótK1(x)=q

Vấn đề với định nghĩa của bạn về K 1 là bạn có thể cần nhiều hơn q bit để mô tả máy Turing có trạng thái q vì bạn cần mã hóa chuyển tiếp.K1qq

Vì vậy, không có K 1K 2 có thể không tương đương, nhưng đó chủ yếu là lỗi của K 1 . Tôi nghĩ rằng chúng ta có thể chứng minh rằng đối với tất cả một > 0 có một c một ví dụ rằng K 1 ( x ) một | x | + c a . Tất nhiên bất kỳ một < 1 là đủ để bác bỏ sự thật rằng K 1 không phải là một chức năng hợp lệ, vì nó có nghĩa là chúng ta có thể mã hóa tất cả hơn 2 n có thể chuỗi có độ dàiK1K2K1a>0caK1(x)a|x|+caa<1K12nn thành một n + c một bit.nan+ca

Nhưng kích thước là một ràng buộc vô cùng chặt chẽ khi xây dựng máy Turing. Ý tưởng là trong một khối các trạng thái bb 2 b cách tìm chuyển đổi cho mỗi trạng thái và điều đó tốt hơn so với cách 2 b thông thường mà bạn có thể điền vào b bit. Sau đó, bạn có thể lưu trữ trong mỗi khối log 2 b bit thông tin. (không phải 2 log 2 b vì bạn phải vào và ra khối này bằng cách này hay cách khác)bb2b2bblog2b

Vì vậy, yeah ... Với khối kích thước 2 1 / một bạn có thể có thể chứng minh K 1 ( x ) một | x | + c a . Nhưng tôi đã viết quá nhiều về lý do tại sao số lượng trạng thái không phải là hàm phức tạp Kolmogorov hợp lệ. Nếu bạn muốn tôi giải thích, tôi sẽ.

Bây giờ về K 2

Các tương ứng với ngôn ngữ mô tả ngây thơ xấp xỉ để K 2 ( x ) = q 2 ( log 2 q + 2 ) (ví dụ: đăng nhập 2 q cho mỗi tiểu bang kế tiếp và chi tiết về ghi và chấm dứt).

Như bạn có vẻ như vậy, tôi tin rằng một cách tốt hơn / gian lận hơn là ủy quyền để mã hóa "dữ liệu" vào máy Turing, có thể bằng cách thêm một thẻ nhị phân trong ngôn ngữ mô tả cho biết liệu trạng thái có phải là trạng thái dữ liệu hay không ( chỉ cần viết một chút và chuyển sang trạng thái tiếp theo) hoặc nếu nó làm điều gì khác. Bằng cách đó, bạn có thể lưu trữ một bit x của mình bằng một bit ngôn ngữ mô tả của bạn.

Tuy nhiên nếu bạn tiếp tục cùng K 2 bạn có thể sử dụng kỹ thuật tương tự tôi đã sử dụng trong phần trước để tiết kiệm một vài bit, nhưng tôi dường như bị mắc kẹt tại K 2 ( x ) một | x | đăng nhập | x | + c (với bất kỳ a > 0 ) .. có thể ít hơn log | x | , thậm chí, nhưng thu được O ( | x | ) có vẻ khó. (Và tôi hy vọng nó phải là | x | , thậm chí không phải O ( |x | ) .)


Bạn có cho rằng K 1 không phải là hàm phức tạp kolmogorov? Điều này rất đáng ngạc nhiên đối với tôi, vì K 1 thực sự là định nghĩa được sử dụng trong một số phép tính đối với khóa học tính toán mà tôi đã từng thực hiện (không phải nó nói bất cứ điều gì về tính đúng đắn của nó).
Ran G.

Vâng thực tế là K 1 ( x ) 12 | x| +ckhá phiền. Hãy xem xét điều này: có2ntừ có thể có củanbit và bạn có thể mã hóa chúng bằng cách sử dụng12 n+cbit? Điều đó có nghĩa là2n=O(2 12 n)(bạn mã hóa phải được tiêm)
jmad

Nếu chương trình python có các ký tự được bảo lưu bởi C thì sao?
PyRulez
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.