Eu tenho o seguinte código Python.
def collatz(n):
if n <= 1:
return True
elif (n%2==0):
return collatz(n/2)
else:
return collatz(3*n+1)
Qual é o tempo de execução desse algoritmo?
Experimentar:
Se denota o tempo de execução da função . Então eu acho que tenho
{ T ( n ) = 1 para n ≤ 1 T ( n ) = T ( n / 2 ) para n par T ( n ) = T ( 3 n + 1 ) para n ímparcollatz(n)
Eu acho que será lg n se n for par, mas como calcular a recorrência em geral?
collatz
tag no MathOverflow, etc. As pesquisas mais recentes mostram que o problema tem qualidades fractais intrínsecas que dificultam.Respostas:
fonte
Você traduziu o código corretamente . Existem muitos métodos para resolver recorrências .
No entanto, atualmente não se sabe se ao
collatz
menos para todosn
; a alegação de que faz é conhecida como conjectura de Collatz . Portanto, nenhum método conhecido funcionará nessa recorrência.fonte
A função de complexidade do tempo é
que pode ser reescrito da seguinte forma, se você estiver interessado em complexidade de tempo assintótica.
A conjectura de Collatz é uma conjectura muito famosa que Collatz propôs em 1937. Muitos matemáticos eminentes passaram (desperdiçados) incontáveis horas tentando resolver essa conjectura, mas com pouco proveito. Até Paul Erdős disse sobre a conjectura de Collatz: "A matemática ainda não está pronta para esses problemas".
fonte
fonte
Você tem T (n) = T (n / 2) + 1 se n for par. Mas então é provável que n / 2 nem seja, então você está preso lá.
O que acontece é que as boas e pequenas regras que você aprendeu são confrontadas com um problema real e não funcionam. Eles atingem uma parede de tijolos, de frente, e dói. Faça um favor a si mesmo e siga a recursão para T (7) manualmente, e então você diz se ainda acredita que isso esteja relacionado lg n.
Se você acha que isso não está relacionado à pergunta original, porque 7 não é par: sempre que n é ímpar, T (n) = T (3n + 1) e 3n + 1 é par; portanto, se T (n) fosse log n se n for par, seria log (3n + 1) + 1 sempre que n> 1 for ímpar.
fonte