Anotações Analise de Algoritmos
me draw
last edit: 2025-12-01T19:08:33Z

Métodos para Resolver Recorrências

Teorema Mestre

T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)

{T(n)Θ(nlogba)nlogba>f(n),T(n)Θ(nlogbalogn)nlogba=f(n),T(n)Θ(f(n))nlogba<f(n).\begin{cases} T(n)\in\Theta\bigl(n^{\log_b a}\bigr) & \mid n^{\log_b a} > f(n),\\[4pt] T(n)\in\Theta\bigl(n^{\log_b a}\log n\bigr) & \mid n^{\log_b a} = f(n),\\[4pt] T(n)\in\Theta\bigl(f(n)\bigr) & \mid n^{\log_b a} < f(n). \end{cases}

T(n)=aT(n/b)+f(n)T(n) = aT(n/b) + f(n)

{T(n)Θ(nlogba)f(n)=O(nlogbaϵ), para ϵ>0,T(n)Θ(nlogbalogk+1n)f(n)=Θ(nlogbalogkn), para k0,T(n)Θ(f(n))f(n)=Ω(nlogba+ϵ), para ϵ>0 e af(n/b)cf(n).\begin{cases} T(n)\in\Theta\bigl(n^{\log_b a}\bigr) & \mid f(n) = O(n^{\log_b a - \epsilon}), \text{ para } \epsilon > 0,\\[6pt] T(n)\in\Theta\bigl(n^{\log_b a}\log^{k+1} n\bigr) & \mid f(n) = \Theta(n^{\log_b a}\log^k n), \text{ para } k \geq 0,\\[6pt] T(n)\in\Theta\bigl(f(n)\bigr) & \mid f(n) = \Omega(n^{\log_b a + \epsilon}), \text{ para } \epsilon > 0 \text{ e } af(n/b) \leq cf(n). \end{cases}

T(n)=aT(n/b)+nkT(n) = aT(n/b) + n^k

{T(n)Θ(nlogba)a>bk,T(n)Θ(nlogbalogn)a=bk,T(n)Θ(f(n))a<bk.\begin{cases} T(n)\in\Theta\bigl(n^{\log_b a}\bigr) & \mid a > b^k,\\[4pt] T(n)\in\Theta\bigl(n^{\log_b a}\log n\bigr) & \mid a = b^k,\\[4pt] T(n)\in\Theta\bigl(f(n)\bigr) & \mid a < b^k. \end{cases}

Árvores de recursão

T(n)=2T(n/2)+nT(n) = 2T(n/2) + n

tabela inferida pela análise da árvore

nível tamanho num. de nós tempo por nó
0 nn 11 nn
1 n/2n/2 22 n/2n/2
2 n/4n/4 44 n/4n/4
i n/2in/2^i 2i2^i n/2in/2^i
? 11 2?2^? 11
nível tamanho num. de nós tempo por nó
0 nn 11 nn
1 n/2n/2 22 n/2n/2
2 n/4n/4 44 n/4n/4
i n/2in/2^i 2i2^i n/2in/2^i
log2nlog_2n 11 2log2n=n2^{log_2n} = n 11

tempo total da árvore

T(n)=i=0nuˊmero de nıˊveis(Tempo do Nıˊvel i)nuˊmero de noˊs do nıˊvel i T(n) = \sum_{i=0}^{\text{número de níveis}} (\text{Tempo do Nível } i) * \text{número de nós do nível } i

T(n)=i=0log2nn2i2i=n(log2n+1)=nlog2n+n=Θ(nlog2n) T(n) = \sum_{i=0}^{\log_2 n} \frac{n}{2^i} * 2^i = n(log_2n + 1) = nlog_2n + n = \Theta(nlog_2n)

Substituição

Exemplo com Mergesort: T(n)=2T(n/2)+nT(n) = 2T(n/2) + n

  • Passo 1: Chute

    • O(nlgn)O(n \lg n).
    • Hipótese Indutiva: Assumimos que T(k)cklgkT(k) \le c \cdot k \lg k para todo k<nk < n.
  • Passo 2: Substituição

    • Substitua T(n/2)T(n/2) pela sua hipótese.
    • T(n)=2[HIPOˊTESE AQUI]+nT(n) = 2 \cdot [\text{HIPÓTESE AQUI}] + n
    • T(n)=2[c(n/2)lg(n/2)]+nT(n) = 2 \cdot [c (n/2) \lg(n/2)] + n
  • Passo 3: A Álgebra (Onde a mágica acontece)

    • Expanda a matemática. Lembre-se que lg(a/b)=lgalgb\lg(a/b) = \lg a - \lg b.
    • T(n)=cn(lgnlg2)+nT(n) = c \cdot n (\lg n - \lg 2) + n
    • T(n)=cnlgncn1+nT(n) = c \cdot n \lg n - c \cdot n \cdot 1 + n (Note que lg2=1\lg 2 = 1)
    • T(n)=cnlgncn+nT(n) = c \cdot n \lg n - cn + n
    • T(n)=cnlgnn(c1)T(n) = c \cdot n \lg n - n(c - 1)
  • Passo 4: Conclusão

    • Queremos provar que T(n)cnlgnT(n) \le c \cdot n \lg n.
    • Olhe para a última linha: T(n)=cnlgnO que queremosn(c1)RestoT(n) = \underbrace{c \cdot n \lg n}_{\text{O que queremos}} - \underbrace{n(c - 1)}_{\text{Resto}}.
    • Para que isso seja cnlgn\le c \cdot n \lg n, o "resto" precisa ser subtraído (ou seja, positivo).
    • n(c1)0    c1n(c - 1) \ge 0 \implies c \ge 1

Fim da prova.

Divisão e Conquista - Algoritmos

O paradigma segue três passos:

  1. Divisão: Particionar o problema em subproblemas menores.
  2. Conquista: Resolver os subproblemas recursivamente.
  3. Combinação: Juntar as soluções dos subproblemas na solução original.

1. Mergesort (Clássico / 2-vias)

Recorrência

T(n)=2T(n/2)+nT(n) = 2T(n/2) + n

Explicação

O algoritmo divide o vetor na metade, ordena recursivamente cada metade e depois intercala (merge) as duas metades ordenadas.

  • Divisão: nn/2b=2n \to n/2 \mid b=2.
  • Ramificação: 2 chamadas recursivas (a=2a=2).
  • Combinação: Para intercalar 2 listas, fazemos 1 comparação para decidir o menor elemento. Custo: 1n1n.

Complexidade (Teorema Mestre)

  • Comparamos nlog22=n1n^{\log_2 2} = n^1 com f(n)=nf(n) = n.
  • Empate (Caso 2): Θ(nlogn)\Theta(n \log n).

2. Mergesort (Variação / 3-vias)

Recorrência

T(n)=3T(n/3)+nT(n) = 3T(n/3) + n

O algoritmo divide o vetor em três partes, ordena cada uma e intercala as três.

  • Divisão: nn/3b=3n \to n/3 \mid b=3.
  • Ramificação: 3 chamadas recursivas (a=3a=3).
  • Combinação: Para intercalar 3 listas, precisamos descobrir o mínimo entre 3 elementos (x,y,zx, y, z). Isso exige 2 comparações. Custo: 2n2n e Θ(2n)=Θ(n)\Theta(2n) = \Theta(n) por isso na recorrência não é mostrado esse tradeoff.

Complexidade (Teorema Mestre)

  • Comparamos nlog33=n1n^{\log_3 3} = n^1 com f(n)=nf(n) = n.
  • Empate (Caso 2): Θ(nlogn)\Theta(n \log n).

Nota: Para o Teorema Mestre, nn e 2n2n pertencem à mesma classe de complexidade (Linear), por isso o resultado assintótico é o mesmo.

3. Trade-off: Por que o 3-vias é "pior"?

Apesar de ambos serem Θ(nlogn)\Theta(n \log n), o Mergesort de 3 partes é geralmente mais lento na prática. Isso acontece devido às constantes ocultas na notação assintótica.

Análise das Recorrências "Honestas" (Contando comparações)

Algoritmo----- Recorrência Exata----------- Altura da Árvore----- Custo por Nível
2-vias T(n)=2T(n/2)+1nT(n) = 2T(n/2) + \mathbf{1}n log2n\log_2 n 1n1n
3-vias T(n)=3T(n/3)+2nT(n) = 3T(n/3) + \mathbf{2}n log3n\log_3 n 2n2n

A Batalha Matemática

  1. Vantagem do 3-vias: A árvore fica mais baixa.
    • log3n0.63log2n\log_3 n \approx 0.63 \cdot \log_2 n (Redução de ~37% na altura).
  2. Desvantagem do 3-vias: O custo de combinação dobra.
    • O trabalho por nível passa de 1n1n para 2n2n (Aumento de 100% no custo).

Conclusão: O esforço extra na combinação (dobro de comparações) supera o ganho obtido pela redução da altura da árvore.

  • Assintoticamente: Iguais (Θ\Theta).
  • Desempenho Real: O clássico (2-vias) é mais eficiente.

Ordenação Baseada em Estruturas de Dados

Heapsort

[...]

notas

O Teorema Mestre é um atalho para a Árvore de Recursão

O Teorema Mestre é um atalho para a Árvore de Recursão resumindo o problema a uma batalha de pesos entre o Custo da Raiz (f(n)f(n)) e o Custo das Folhas (nlogban^{\log_b a}).

Custo das Folhas = nlogban^{\log_b a}?

Sim, que é o número de folhas e cada folha ter custo 1 por definição. Número de folhas no nível (ii) é (aia^i).

No caso, T(n)=4T(n/3)+nlognT(n) = 4T(n/3) + nlogn:

i=log3n ,pois1=n/3i,i = ?3i=nlog3i=logni=lognlog3=log3ni = log_3n \text{ ,pois}\\ 1 = n/3^i, \text{i = ?}\\ 3^i = n\\ log3^i = log n\\ i = \frac{logn}{log3} = log_3n

Com isso achamos o valor de ?? que no exemplo da tabela era log2nlog_2n.

Então o número de nós no nível folha em (T(n)=4T(n/3)+nlognT(n) = 4T(n/3) + nlogn) é igual a 4log3n4^{log_3n}, e usando a propriedade do log, trocamos 44 e nn, ficando nlog34n^{log_34} que é nlogban^{log_ba}

Insights dessa Análise (A Geometria do Custo)

1. A Regra do aa vs bb (Quem domina a soma?)

A relação entre a taxa de ramificação (aa) e a taxa de divisão (bb) define o formato do custo:

  1. Topo Pesado / Decaimento (a<bka < b^k)
    • O custo diminui descendo a árvore. A Raiz domina.
    • Resposta: Θ(f(n))\Theta(f(n)).
  2. Retângulo / Equilíbrio (a=bka = b^k)
    • O custo é constante em todos os níveis. Empate.
    • Resposta: Θ(f(n)logn)\Theta(f(n) \cdot \log n).
  3. Fundo Pesado / Explosão (a>bka > b^k)
    • O custo aumenta descendo a árvore. As Folhas dominam.
    • Resposta: Θ(Folhas)=Θ(nlogba)\Theta(\text{Folhas}) = \Theta(n^{\log_b a}).
me profile picture draw

Francisco Ossian

Desenvolvendo ideias e criando soluções

Serviços
  • Desenvolvimento Front-end
  • Desenvolvimento Mobile
  • Automação de Processos
  • Desenvolvimento de APIs
  • Consultoria e Auditoria de Código
  • Desenvolvimento de Ferramentas e Utilitários
  • Criação de Blogs e Conteúdo Técnico
Navegar
  • Blog
  • Work
  • Home
Contato
  • /github-icon.svg
  • /linkedin-icon.svg
  • /email-icon.svg
  • /wpp-icon.svg