Istnieje wiele sposobów definiowania złożoności Kołmogorowa i zwykle wszystkie te definicje są równoważne do stałej addytywnej. To znaczy, jeśli i są funkcjami złożoności Kołmogorowa (zdefiniowanymi za pomocą różnych języków lub modeli), wówczas istnieje stała taka, że dla każdego łańcucha , . Uważam, że dzieje się tak, ponieważ dla każdej funkcji złożoności Kołmogorowa K i dla każdego to utrzymuje , dla niektórych stałych .
Interesują mnie następujące definicje , oparte na maszynach Turinga
- liczba stanów : Zdefiniuj aby była minimalną liczbą tak, że TM ze stanami wyprowadza na pustym ciągu.
Czy i równoważne? Jaka jest relacja między nimi, a która lepiej rozumie złożoność Kołmogorowa, jeśli nie są one równoważne.
To, co szczególnie mnie wkurza, to wzrost przy , który wydaje się nie być superliniowy (lub przynajmniej liniowy ze stałą taką, że , a nie ). Rozważ najprostszą TM, która generuje - tę, która właśnie koduje jako część funkcji stanów i przejść. od razu widać, że . Jednak kodowanie tej samej maszyny jest znacznie większe, a trywialne ograniczenie, które otrzymuję, to .
Odpowiedzi:
Z góry przepraszam za to, że podam zbyt wiele szczegółów, ale mam zamiar zaprzeczyć ludziom.
OK(x)≤K′(x)+c
Fakt, że zwykle pochodzi z tłumacza języka opisu nr 2 na język opisu nr 1, a nie z tłumaczenia z programów nr 2 na programy nr 1.K1(x)≤K2(x)+c
Na przykład i otrzymujesz tę nierówność tak prosto jak to:KC(x)≤KPython(x)+cpy2c
Wtedy twoja stała będzie wynosić coś w rodzaju gdzie to liczba bitów dla tego kodu, a bitów to rozmiar, jaki oficjalny interpreter napisał w języku C. Oczywiście musisz tylko zinterpretować, co jest możliwe w języku opisu dla Pythona, dzięki czemu możesz zrobić lepiej niż 69 MB :-)cpy2c 528+490240688 528 490240688
Ważne jest, abyś mógł pisać program Python liniowo w kodzie C. Na przykład język, w którym należy wstawić „BANANA” między każdą ze znaków, nie jest bardzo dobrym programem opisu, a właściwość jest wówczas fałszywa. (Ale jeśli język opisu upoważnia do zapisywania danych w osobnym pliku lub bloku, problem ten znika)
Dlaczego twój jest wadliwyK1(x)=q
Problem z twoją definicją polega na tym, że możesz potrzebować więcej niż bitów, aby opisać maszynę Turinga ze stanami , ponieważ musisz zakodować przejścia.K1 q q
Więc żadne i prawdopodobnie nie są równoważne, ale to głównie wina . Myślę, że możemy udowodnić, że dla wszystkich istnieje takie, że . Oczywiście każdy wystarcza, aby obalić fakt, że nie jest prawidłową funkcją, ponieważ oznaczałoby to, że możemy zakodować więcej wszystkich możliwych ciągów długości do bitów .K1 K2 K1 a>0 ca K1(x)≤a|x|+ca a<1 K1 2n n an+ca
Ale rozmiar jest niezwykle ciasno związany przy budowie maszyn Turinga. Chodzi o to, że w bloku stwierdza istnieją sposobów na znalezienie przejścia dla każdego stanu i tak lepiej niż zwykłe sposobów można wypełnić bitów. Następnie możesz przechowywać w każdym bloku bity informacji. (nie ponieważ musisz wejść i wyjść z bloku w taki czy inny sposób)b b2b 2b b log2b 2log2b
Więc tak ... Przy blokach wielkości prawdopodobnie możesz udowodnić . Ale już napisałem zbyt wiele o tym, dlaczego liczba stanów nie jest prawidłową funkcją złożoności Kołmogorowa. Jeśli chcesz, żebym to rozwinął, zrobię to.21/a K1(x)≤a|x|+ca
Teraz oK2
Naiwny język opisowy odpowiada mniej więcej (tzn. dla każdego następnego stanu i szczegółów dotyczących zapisu i zakończenia).K2(x)=q⋅2⋅(log2q+2) log2q
Jak się wydaje, jestem przekonany, że lepszym / oszukańczym sposobem byłoby upoważnienie do kodowania „danych” na maszynie Turinga, być może poprzez dodanie binarnego znacznika w języku opisu, który mówi, czy stan jest stanem danych ( to po prostu pisze i przechodzi do następnego stanu) lub jeśli robi coś innego. W ten sposób możesz przechowywać jeden bit w jednym bicie twojego języka opisowego.x
Jeśli jednak ten sam możesz użyć tej samej techniki, której użyłem w poprzedniej części, aby zapisać kilka bitów, ale wydaje mi się, że utknąłem na (dla dowolne ) .. może mniej niż, nawet, ale uzyskanie wydaje się trudne. (I spodziewam się, że powinien to być , nawet .)K2 K2(x)≤a|x|log|x|+c a>0 log|x| O(|x|) |x| O(|x|)
źródło