Mam następujący kod Python.
def collatz(n):
if n <= 1:
return True
elif (n%2==0):
return collatz(n/2)
else:
return collatz(3*n+1)
Jaki jest czas działania tego algorytmu?
Próbować:
Jeśli oznacza czas działania funkcji . Więc myślę, że mam
{ T ( n ) = 1 dla n ≤ 1 T ( n ) = T ( n / 2 ) dla n parzystych T ( n ) = T ( 3 n + 1 ) dla n nieparzystychcollatz(n)
Myślę, że będzie lg n, jeśli n jest parzyste, ale jak ogólnie obliczyć nawrót?
collatz
znacznik na MathOverflow itp. Ostatnie badania pokazują, że problem ma wewnętrzne cechy fraktali, co utrudnia.Odpowiedzi:
źródło
Ci prawidłowo przetłumaczone kod . Istnieje wiele metod rozwiązywania nawrotów .
Jednak obecnie nie wiadomo, czy w
collatz
ogóle się zatrzymujen
; twierdzenie, że tak jest, jest znane jako hipoteza Collatza . Dlatego żadna znana metoda nie będzie działać na ten nawrót.źródło
Funkcja złożoności czasowej to
które można przepisać w następujący sposób, jeśli interesuje Cię asymptotyczna złożoność czasu.
Hipoteza Collatza jest bardzo znaną hipotezą, którą Collatz zaproponował w 1937 r. Wielu wybitnych matematyków spędzało (czytało zmarnowane) niezliczone godziny na próbach rozwiązania tej hipotezy, ale bezskutecznie. Nawet Paul Erdős powiedział o przypuszczeniu Collatza: „Matematyka nie jest jeszcze gotowa na takie problemy”.
źródło
źródło
Masz T (n) = T (n / 2) + 1, jeśli n jest parzyste. Ale wtedy n / 2 prawdopodobnie nie jest nawet, więc utkniesz tam.
To, co się dzieje, polega na tym, że te małe, miłe zasady, których się nauczyłeś, stają przed prawdziwym problemem i nie działają. Uderzają w ścianę z cegły, twarzą w twarz, a to boli. Zrób sobie przysługę i ręcznie wykonaj rekurencję dla T (7), a następnie powiesz, czy nadal uważasz, że jest to związane lg n.
Jeśli uważasz, że nie ma to związku z pierwotnym pytaniem, ponieważ 7 nie jest parzyste: ilekroć n jest nieparzyste, T (n) = T (3n + 1), a 3n + 1 jest parzyste, więc jeśli T (n) było log n, jeśli n jest parzyste, będzie to log (3n + 1) + 1, gdy n> 1 jest nieparzysty.
źródło