Questão nº 28

Questão de Tecnologia da Informação · FGV CVM 2024 (nº 28)

FGV2024Analista CVM - TI Sistemas e Desenvolvimento (Perfil 8)Tecnologia da Informação
Gabarito: Aver comentário ↓

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 é:

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 T(n)T(n) é o número de movimentos para nn discos:

  • Para n=1n=1, há 1 movimento: T(1)=1T(1) = 1.
  • Para n>1n > 1, o problema é dividido em três passos:
    1. Mover n1n-1 discos da origem para o pino auxiliar: T(n1)T(n-1) movimentos.
    2. Mover o disco nn (o maior) da origem para o destino: 1 movimento.
    3. Mover n1n-1 discos do pino auxiliar para o destino: T(n1)T(n-1) movimentos.
      Isso nos dá a relação: T(n)=T(n1)+1+T(n1)    T(n)=2T(n1)+1T(n) = T(n-1) + 1 + T(n-1) \implies T(n) = 2T(n-1) + 1.

Resolvendo essa recorrência:
T(n)=2T(n1)+1T(n) = 2T(n-1) + 1
T(n)=2(2T(n2)+1)+1=4T(n2)+2+1T(n) = 2(2T(n-2) + 1) + 1 = 4T(n-2) + 2 + 1
T(n)=4(2T(n3)+1)+3=8T(n3)+4+3T(n) = 4(2T(n-3) + 1) + 3 = 8T(n-3) + 4 + 3
Generalizando, T(n)=2kT(nk)+(2k1)T(n) = 2^k T(n-k) + (2^k - 1).
Para k=n1k = n-1: T(n)=2n1T(1)+(2n11)T(n) = 2^{n-1} T(1) + (2^{n-1} - 1).
Como T(1)=1T(1) = 1: T(n)=2n1×1+2n11=2×2n11=2n1T(n) = 2^{n-1} \times 1 + 2^{n-1} - 1 = 2 \times 2^{n-1} - 1 = 2^n - 1.

Portanto, o número de movimentos (e, consequentemente, de operações) é 2n12^n - 1. Em notação Big O, que foca na ordem de crescimento, a complexidade é O(2n)O(2^n).

(A) Correta: A complexidade do algoritmo da Torre de Hanói é exponencial, dada pelo número de movimentos 2n12^n - 1. Em notação Big O, isso é O(2n)O(2^n), indicando um crescimento exponencial. A alternativa O(2n)O(2n) formalmente representa um crescimento linear, equivalente a O(n)O(n). A armadilha aqui é confundir a base da exponenciação (o '2' de 2n2^n) 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 O(2n)O(2n) ser usualmente associada a um crescimento linear.
(B) Incorreta: O(n)O(n) indica um crescimento linear, muito mais lento do que o crescimento exponencial real do algoritmo da Torre de Hanói.
(C) Incorreta: O(nlogn)O(n \log n) é 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: O(n2)O(n^2) indica um crescimento quadrático, que é mais lento que o crescimento exponencial do algoritmo da Torre de Hanói.
(E) Incorreta: O(logn)O(\log n) 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.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho