J'ai le code Python suivant.
def collatz(n):
if n <= 1:
return True
elif (n%2==0):
return collatz(n/2)
else:
return collatz(3*n+1)
Quel est le temps d'exécution de cet algorithme?
Essayer:
Si désigne le temps d'exécution de la fonction . Alors je pense que j'ai
{ T ( n ) = 1 pour n ≤ 1 T ( n ) = T ( n / 2 ) pour n pair T ( n ) = T ( 3 n + 1 ) pour n impaircollatz(n)
Je pense que sera si est pair mais comment calculer la récurrence en général?lg n n
collatz
balise sur MathOverflow etc. les dernières recherches montrent que le problème a des qualités fractales intrinsèques qui le rendent difficile.Réponses:
C'est la conjecture de Collatz - problème toujours ouvert.∞
La conjecture consiste à prouver que cette séquence s'arrête pour toute entrée, car cela n'est pas résolu, nous ne savons pas comment résoudre cette relation de récurrence d'exécution, de plus, elle ne peut pas s'arrêter du tout - donc jusqu'à preuve du contraire, le temps d'exécution est inconnu et peut être .
la source
Vous avez correctement traduit le code . Il existe de nombreuses méthodes pour résoudre les récidives .
Cependant, il est actuellement inconnu si
collatz
même s'arrête pour tousn
; l'affirmation qu'il fait est connue sous le nom de conjecture de Collatz . Par conséquent, aucune méthode connue ne fonctionnera sur cette récurrence.Comment? Je suppose que vous pensez à , pour lequel votre affirmation est correcte. Cela montre que cette récurrence n'est pas celle que nous pouvons résoudre jusqu'à en étudiant exponentiellement peu de points (voir aussi ici ).n = 2k Θ
la source
La fonction de complexité temporelle est
qui peut être réécrit comme suit si vous êtes intéressé par la complexité temporelle asymptotique.
On ne sait même pas que la TM résultante (Voir Halting Problem ) pour chaque . Donc, naturellement, nous ne pouvons pas mesurer le temps d'arrêt si nous ne savons même pas s'il s'arrête pour chaque . Reportez-vous également à /math/2694/what-is-the-importance-of-the-collatz-conjecture .n n⟨M,1n⟩∈Halt n n
La conjecture de Collatz est une conjecture très célèbre que Collatz a proposée en 1937. De nombreux mathématiciens éminents ont passé (lu gaspillé) d'innombrables heures à essayer de résoudre cette conjecture, mais en vain. Même Paul Erdős a déclaré à propos de la conjecture de Collatz: "Les mathématiques ne sont pas encore prêtes pour de tels problèmes."
la source
la source
Vous avez T (n) = T (n / 2) + 1 si n est pair. Mais alors n / 2 n'est probablement pas égal, donc vous êtes coincé là-bas.
Ce qui se passe, c'est que les jolies petites règles que vous avez apprises sont confrontées à un vrai problème, et elles ne fonctionnent pas. Ils ont frappé un mur de briques, le visage en premier, et ça fait mal. Faites-vous plaisir et suivez manuellement la récursivité de T (7), puis vous direz si vous croyez toujours que c'est lié lg n.
Si vous pensez que cela n'est pas lié à la question d'origine car 7 n'est pas pair: chaque fois que n est impair, T (n) = T (3n + 1), et 3n + 1 est pair, donc si T (n) était log n si n est pair, il serait log (3n + 1) + 1 chaque fois que n> 1 est impair.
la source