Równoważność definicji złożoności Kołmogorowa


20

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 K1 i K2 są funkcjami złożoności Kołmogorowa (zdefiniowanymi za pomocą różnych języków lub modeli), wówczas istnieje stała c taka, że ​​dla każdego łańcucha x , |K1(x)−K2(x)|<c . Uważam, że dzieje się tak, ponieważ dla każdej funkcji złożoności Kołmogorowa KK i dla każdego x to utrzymujeK(x)≤|x|+c , dla niektórych stałychc .

Interesują mnie następujące definicje K , oparte na maszynach Turinga

  1. liczba stanów : Zdefiniuj K1(x) aby była minimalną liczbą q tak, że TM ze stanami q wyprowadza x na pustym ciągu.
  2. K2(x)xM⟨M⟩K2(x)=min|⟨M⟩|Mx

Czy K1 i K2 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 K2 przy x , który wydaje się nie być superliniowy (lub przynajmniej liniowy ze stałą C>1 taką, że K2<C|x| , a nie |x|+c ). Rozważ najprostszą TM, która generuje x - tę, która właśnie koduje x jako część funkcji stanów i przejść. od razu widać, że K1(x)≤|x|+1 . Jednak kodowanie tej samej maszyny jest znacznie większe, a trywialne ograniczenie, które otrzymuję, to K2(x)≤|x|log⁡|x|.


Istnieje więcej niż 2n2 maszyn ze stanami n , a ich średni rozmiar wynosi co najmniej n2 , dlatego jest mało prawdopodobne, aby różniły się one jedynie stałą addytywną.
— Kaveh

1
Istnieje dobrze znana granica, żedla niektórych stałych niezależnych od . Jest tak, ponieważ możemy zakodować w języku bez prefiksów, po prostu podwajając każdy bit a następnie kończąc na . To zajmuje bity do reprezentowania . Ponieważ jest zdefiniowane w kategoriach uniwersalnej maszyny bez prefiksów, dla niektórych stałych . Można to poprawić, używając bardziej inteligentnego sposobu kodowania w języku wolnym od prefiksów. K2(x)≤c+2|x|cxxx012|x|+2xK2K2(x)≤2|x|+2+c′cx
— Carl Mummert

Nie widzę jak. Wygląda na to, że albo jest podawany jako część kodowania (jako surowe dane), albo musisz zbudować za pomocą maszyny stanów. Pierwsza opcja wydaje się oszukiwać i nie rozumiem, jak można ją porównać do drugiej opcji (co implikuje )xxK1
— Ran G.

@Ran G .: Kluczowym punktem jest twierdzenie o niezmienniczości opisane na en.wikipedia.org/wiki/Invariance_theorem . Jeśli potrafię opisać jakikolwiek skuteczny system, który ma tempo wzrostuwtedy uniwersalna maszyna Turinga (jak dla ) spełni to w ramach stałej addytywnej. Maszyna uniwersalna to taka, która pobiera są wprowadzane i zwraca wynik jeśli zatrzyma. 2|x|K2⟨M⟩MM
— Carl Mummert

Odpowiedzi:


6

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

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

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

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 :-)cpy2c528+490240688528490240688

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.K1qq

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 .K1K2K1a>0caK1(x)≤a|x|+caa<1K12nnan+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)bb2b2bblog2⁡b2log2⁡b

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/aK1(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⋅(log2⁡q+2)log2⁡q

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 .)K2K2(x)≤a|x|log⁡|x|+ca>0log⁡|x|O(|x|)|x|O(|x|)


Ci twierdzą, że nie jest funkcją złożoności Kołmogorowa? Jest to dla mnie bardzo zaskakujące, ponieważ jest w rzeczywistości definicją stosowaną w pewnym kursie wstępu do obliczalności, który kiedyś podjąłem (nie dlatego, że mówi coś o jego poprawności). K1K1
— Ran G.

Cóż, fakt, że jest dość niepokojący. Zastanów się: istnieją możliwych słów bitów i możesz je zakodować za pomocą bitów ? Oznaczałoby to (twoje kodowanie musi być iniekcyjne)K1(x)≤12|x|+c2nn12n+c2n=O(212n)
— jmad

Co się stanie, jeśli program python ma znaki zastrzeżone przez C?
— PyRulez,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.