Kiedy Alan Turing odkrył komputer, zaproponowano kilka modeli tego komputera. Turing udowodnił, że niektóre (3) z tych modeli mogą się symulować ORAZ obliczać funkcję Ackermanna, podczas gdy inne modele mogą symulować się nawzajem, ale nie funkcję Ackermanna (więc nie mogą symulować 3). Dlatego te 3 modele (Turing Machine, von Neumann i jeden, którego nie znam) zostały wybrane jako architektura komputera. Nie oznacza to, że funkcja Ackermanna jest granicą komputera, ale przypuszczam, że to twarda nauka. Nie znam żadnych obliczalnych funkcji, które rosną szybciej niż funkcja Ackermanna.
Nie sądzę, aby istniał problem praktyczny pasujący do twojego pytania, ale być może uda nam się go rozwiązać. Musimy jednak nałożyć ograniczenia na dane wejściowe. Ponieważ nie możemy użyć O (n), nie możemy sprawdzić całego wejścia. W rzeczywistości nie możemy nawet sprawdzić długości danych wejściowych, ponieważ byłoby to O (log n). Zatem jako pierwszy parametr potrzebujemy reprezentacji długości reszty danych wejściowych, na przykład c, tak aby Ackermann (c) był długością danych wejściowych. Ponieważ nie jest to również odpowiednie, jako pierwszą wartość w naszym danych wejściowych wymagamy parametru c, tak aby bb (c) był mniej więcej długości wejścia, gdzie bb jest funkcją bobra zajętego. Ta funkcja jest niepoprawna, ale bb (c) z pewnością istnieje. Następnie algorytm wygląda następująco:
for (int i=0; i<c; i++) {
if (input[i] == null) {
return false;
}
}
return true;
Algorytm ma na celu sprawdzenie, czy jeśli c jest odwrotnością bb, to wtedy długość wejściowa jest większa niż bb (c).
Jeśli istnieje funkcja obliczalna, która rośnie szybciej niż funkcja Ackermanna, myślę, że możemy użyć jej odwrotności do stworzenia algorytmu, który odpowie na twoje pytanie na dowolnym wejściu.