Tengo el siguiente código de Python.
def collatz(n):
if n <= 1:
return True
elif (n%2==0):
return collatz(n/2)
else:
return collatz(3*n+1)
¿Cuál es el tiempo de ejecución de este algoritmo?
Tratar:
Si denota el tiempo de ejecución de la función . Entonces creo que tengo
collatz(n)
Creo que será si es par, pero ¿cómo calcular la recurrencia en general?lg n n
collatz
etiqueta en MathOverflow, etc. Las últimas investigaciones muestran que el problema tiene cualidades fractales intrínsecas que lo dificultan.Respuestas:
Esta es la conjetura de Collatz, un problema aún abierto.∞
La conjetura es sobre la prueba de que esta secuencia se detiene para cualquier entrada, ya que esto no está resuelto, no sabemos cómo resolver esta relación de recurrencia en tiempo de ejecución, además, es posible que no se detenga en absoluto, por lo que hasta que se pruebe, el tiempo de ejecución es desconocido y puede ser .
fuente
Has traducido el código correctamente . Existen muchos métodos para resolver las recurrencias .
Sin embargo, actualmente se desconoce si
collatz
incluso se detiene para todosn
; la afirmación de que sí se conoce como conjetura de Collatz . Por lo tanto, ningún método conocido funcionará en esta recurrencia.¿Cómo es eso? Supongo que estás pensando en , para lo cual tu afirmación es correcta. Esto demuestra que esta recurrencia no es una que podamos resolver hasta Θ investigando exponencialmente pocos puntos (ver también aquí ).n=2k Θ
fuente
La función de complejidad temporal es
que puede reescribirse como sigue si está interesado en la complejidad asintótica del tiempo.
La conjetura de Collatz es una conjetura muy famosa que Collatz propuso en 1937. Muchos matemáticos eminentes han pasado (leído perdido) innumerables horas tratando de resolver esta conjetura, pero fueron en vano. Incluso Paul Erdős dijo sobre la conjetura de Collatz: "Las matemáticas aún no están listas para tales problemas".
fuente
fuente
Tienes T (n) = T (n / 2) + 1 si n es par. Pero entonces es muy probable que n / 2 ni siquiera, así que estás atrapado allí.
Lo que sucede es que las pequeñas reglas que aprendiste se enfrentan a un problema real y no funcionan. Golpean una pared de ladrillos, se enfrentan primero, y duele. Hágase un favor y siga la recursividad de T (7) manualmente, y luego le dice si todavía cree que esto está relacionado lg n.
Si cree que esto no está relacionado con la pregunta original porque 7 no es par: siempre que n sea impar, T (n) = T (3n + 1) y 3n + 1 es par, entonces si T (n) fuera log n si n es par, sería log (3n + 1) + 1 siempre que n> 1 sea impar.
fuente