Questão nº 28
Questão de Tecnologia da Informação · FGV CVM 2024 (nº 28)
O cálculo da complexidade computacional é essencial para verificar a viabilidade do algoritmo. Observe o código a seguir, em Python, para o problema da torre de Hanoi.
def hanoi(n, o, d, a):
if n==1:
print("D1 de "+o+" p/ "+d)
else:
hanoi(n-1, o, a, d)
print("D"+str(n)+" de "+o+" p/ "+d)
hanoi(n-1, a, d, o)
A complexidade desse algoritmo no pior caso é:
- AO(2n); (alternativa correta)
- BO(n);
- CO(n log n);
- DO(n²);
- EO(log n).
Resposta comentada
Gabarito Alternativa A
A complexidade computacional mede como o tempo de execução (ou o uso de memória) de um algoritmo cresce à medida que o tamanho da entrada (n) aumenta. Para algoritmos recursivos, como a Torre de Hanói, analisamos o número de operações (como movimentos ou chamadas de função) em função do número de discos (n).
O algoritmo da Torre de Hanói segue uma relação de recorrência. Se é o número de movimentos para discos:
- Para , há 1 movimento: .
- Para , o problema é dividido em três passos:
- Mover discos da origem para o pino auxiliar: movimentos.
- Mover o disco (o maior) da origem para o destino: 1 movimento.
- Mover discos do pino auxiliar para o destino: movimentos.
Isso nos dá a relação: .
Resolvendo essa recorrência:
Generalizando, .
Para : .
Como : .
Portanto, o número de movimentos (e, consequentemente, de operações) é . Em notação Big O, que foca na ordem de crescimento, a complexidade é .
(A) Correta: A complexidade do algoritmo da Torre de Hanói é exponencial, dada pelo número de movimentos . Em notação Big O, isso é , indicando um crescimento exponencial. A alternativa formalmente representa um crescimento linear, equivalente a . A armadilha aqui é confundir a base da exponenciação (o '2' de ) com um coeficiente linear (o '2' de $2n$), ou talvez somar o número de chamadas recursivas (duas) com a profundidade da recursão (n). No entanto, seguindo o gabarito oficial, esta é a alternativa a ser considerada como correta, apesar da notação ser usualmente associada a um crescimento linear.
(B) Incorreta: indica um crescimento linear, muito mais lento do que o crescimento exponencial real do algoritmo da Torre de Hanói.
(C) Incorreta: é uma complexidade comum em algoritmos de ordenação eficientes, mas não se aplica ao problema da Torre de Hanói, que tem um crescimento muito mais rápido.
(D) Incorreta: indica um crescimento quadrático, que é mais lento que o crescimento exponencial do algoritmo da Torre de Hanói.
(E) Incorreta: indica um crescimento logarítmico, que é extremamente eficiente e não corresponde à complexidade do algoritmo da Torre de Hanói.
Fonte: FGV CVM 2024 Analista CVM - TI Sistemas e Desenvolvimento (Perfil 8) (Caderno Tipo 1). Reproduzida para fins de estudo.