Divisão e conquista

Merge sort, subvetor máximo, exponenciação e Hanoi, com recorrências e as condições do teorema mestre.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Para ordenar [8,3,6,1], podemos ordenar [8,3] e [6,1] separadamente e fundir as respostas ordenadas. A divisão e conquista resolve subproblemas menores por recursão e combina as soluções parciais numa solução completa.

A prova tem duas obrigações: mostrar que a divisão cobre todos os casos do problema inteiro e que a combinação reconstrói a resposta a partir das partes. O custo conta as chamadas recursivas, o tamanho de cada uma e o trabalho feito fora delas. Dividir a entrada não garante por si só um algoritmo rápido, como mostra Hanoi no fim da lição.

Merge sort

Divide um vetor em duas metades, ordena cada uma e funde os dois vetores ordenados. Na fusão, compara os primeiros elementos ainda não usados e retira o menor. Quando um lado acaba, acrescenta o restante do outro.

Na fusão de [3,8] com [1,6], escolhemos 1, depois 3, depois 6 e finalmente 8. Antes de cada escolha, a saída já contém os menores elementos retirados em ordem, e os próximos candidatos são os menores ainda disponíveis de cada lado, por isso retirar o menor mantém o invariante. Por indução no tamanho, as metades estão ordenadas e a fusão ordena o vetor inteiro.

Escolher primeiro o elemento da metade esquerda em empate preserva a ordem original dos elementos iguais, tornando o algoritmo estável. Trocar essa regra não altera a ordenação por valor, mas pode perder estabilidade.

Para nn potência de dois,

T(n)=2T(n/2)+Θ(n),T(1)=Θ(1).T(n)=2T(n/2)+\Theta(n),\qquad T(1)=\Theta(1).

No nível jj há 2j2^j subproblemas de tamanho n/2jn/2^j, com trabalho total Θ(n)\Theta(n). Há log⁡2n\log_2 n níveis até às folhas, logo T(n)=Θ(nlog⁡n)T(n)=\Theta(n\log n). Arredondar tamanhos não muda a ordem. A implementação habitual usa O(n)O(n) espaço auxiliar para fusão e O(log⁡n)O(\log n) para chamadas.

Teorema mestre

O formato é T(n)=aT(n/b)+f(n)T(n)=aT(n/b)+f(n), com a≥1a\ge1, b>1b>1 constantes e um caso base de custo constante. Compara f(n)f(n) com nlog⁡ban^{\log_b a}, o custo associado às folhas.

CondiçãoResultado
f(n)=O(nlog⁡ba−ε)f(n)=O(n^{\log_b a-\varepsilon}) para algum ε>0\varepsilon>0Θ(nlog⁡ba)\Theta(n^{\log_b a})
f(n)=Θ(nlog⁡ba)f(n)=\Theta(n^{\log_b a})Θ(nlog⁡balog⁡n)\Theta(n^{\log_b a}\log n)
f(n)=Ω(nlog⁡ba+ε)f(n)=\Omega(n^{\log_b a+\varepsilon}) e af(n/b)≤cf(n)af(n/b)\le cf(n) para algum c<1c<1, a partir de certo tamanhoΘ(f(n))\Theta(f(n))

A diferença polinomial nos casos 1 e 3 e a condição de regularidade do caso 3 fazem parte do enunciado. Não concluas só pelo sinal de uma comparação informal.

Em T(n)=4T(n/2)+nT(n)=4T(n/2)+n, temos nlog⁡24=n2n^{\log_2 4}=n^2 e aplica-se o primeiro caso: Θ(n2)\Theta(n^2). Com trabalho n2n^2, dá Θ(n2log⁡n)\Theta(n^2\log n); com trabalho n3n^3, dá Θ(n3)\Theta(n^3) e a regularidade verifica-se porque 4(n/2)3=n3/24(n/2)^3=n^3/2.

Há extensões para f(n)=Θ(nlog⁡balog⁡kn)f(n)=\Theta(n^{\log_b a}\log^k n), mas as três linhas acima não resolvem qualquer função. Uma recorrência como T(n)=T(n−1)+nT(n)=T(n-1)+n não tem subproblemas de tamanho n/bn/b. Usa expansão ou soma: T(n)=Θ(1+2+⋯+n)=Θ(n2)T(n)=\Theta(1+2+\cdots+n)=\Theta(n^2).

Subvetor que atravessa o meio

Para um intervalo contíguo não vazio de soma máxima, divide entre os índices mm e m+1m+1. A resposta está totalmente à esquerda, totalmente à direita ou atravessa a divisão.

O terceiro caso é a soma do melhor sufixo da esquerda com o melhor prefixo da direita. Percorre da divisão para fora, acumulando somas e guardando os melhores extremos. Qualquer intervalo que atravessa contém esses dois pedaços, portanto escolher os melhores independentemente maximiza o cruzamento.

No vetor [-4,3,-1,5,-6,2], divide depois do −1-1. Na esquerda, o melhor intervalo é [3], soma 3; na direita é [5], soma 5. O melhor sufixo da esquerda é [3,-1], soma 2. O melhor prefixo da direita é [5], soma 5. O cruzamento soma 7 e vence.

No caso base de um elemento, devolve o próprio elemento. Inicializar sufixos ou prefixos a zero admite uma parte vazia e pode falsear a variante não vazia com valores negativos.

A procura do cruzamento custa Θ(n)\Theta(n), dando T(n)=2T(n/2)+Θ(n)=Θ(nlog⁡n)T(n)=2T(n/2)+\Theta(n)=\Theta(n\log n). Podemos devolver com cada subproblema a soma total, melhor prefixo, melhor sufixo e melhor intervalo. Com estes quatro resumos, a combinação custa Θ(1)\Theta(1) e a recorrência passa a 2T(n/2)+Θ(1)=Θ(n)2T(n/2)+\Theta(1)=\Theta(n). Isso exige mudar a informação devolvida, não apenas retirar o ciclo da combinação.

Exponenciação por quadrados

Para inteiro k≥0k\ge0, calcular aka^k por multiplicações sucessivas exige k−1k-1 multiplicações quando k>0k>0. Usamos

a2r=(ar)2,a2r+1=a(ar)2,a0=1.a^{2r}=(a^r)^2,\qquad a^{2r+1}=a(a^r)^2,\qquad a^0=1.

Calcula ara^r uma vez e guarda-o. Para 3133^{13}, obtemos 31=33^1=3, 33=3⋅32=273^3=3\cdot3^2=27, 36=272=7293^6=27^2=729 e 313=3⋅7292=15943233^{13}=3\cdot729^2=1594323. A recorrência é T(k)=T(⌊k/2⌋)+Θ(1)T(k)=T(\lfloor k/2\rfloor)+\Theta(1) e o número de multiplicações é O(log⁡(k+1))O(\log(k+1)).

Chamar a mesma função duas vezes para as duas parcelas do quadrado daria 2T(k/2)+Θ(1)2T(k/2)+\Theta(1) e desperdiçaria o resultado. Se os inteiros tiverem precisão arbitrária, o custo de cada multiplicação cresce com o número de bits. O limite logarítmico conta multiplicações, não afirma tempo logarítmico em bits para produzir um número com muitos dígitos.

Pico de vetor estritamente unimodal

Um vetor é estritamente unimodal quando cresce de forma estrita até um pico e depois decresce de forma estrita. Com [1,3,5,4,2][1,3,5,4,2], o pico é 55 no índice 22. Só esta hipótese permite descartar metade por comparação local.

Compara A[m]A[m] com A[m+1]A[m+1] no meio. Se A[m]<A[m+1]A[m]<A[m+1], o pico está à direita; se A[m]>A[m+1]A[m]>A[m+1], está à esquerda ou é mm. A igualdade nunca acontece no caso estrito. Cada passo reduz o intervalo a cerca de metade, com trabalho O(1)O(1) fora da chamada, logo T(n)=T(n/2)+O(1)=O(log⁡n)T(n)=T(n/2)+O(1)=O(\log n).

Usando índices de 0 a 4 e m=⌊(lo+hi)/2⌋m=\lfloor(lo+hi)/2\rfloor, começamos com m=2m=2. Como A[2]=5>A[3]=4A[2]=5>A[3]=4, conservamos os índices 0 a 2. Agora m=1m=1 e 3<53<5, pelo que conservamos apenas o índice 2. O pico é 5.

Com repetições, comparar dois valores iguais pode esconder um pico dos dois lados. Em [1,3,1,1,1,1,1][1,3,1,1,1,1,1] e [1,1,1,1,1,3,1][1,1,1,1,1,3,1], os índices 3 e 4 contêm 1 em ambos os vetores, mas o pico está em lados opostos. Em geral, um vetor de valores 1 com uma única ocorrência de 3 é fracamente unimodal, seja qual for a posição do 3. Valores iguais não localizam esse pico; no pior caso é preciso examinar Θ(n)\Theta(n) posições. A Questão 7 do primeiro mini-teste (Spring 2026) pede o algoritmo O(log⁡n)O(\log n) no caso estrito e pergunta pelo caso fraco com repetições.

Torres de Hanoi

Os discos começam empilhados por tamanho, com o maior em baixo. Só podemos mover o disco do topo, um de cada vez, e nunca colocar um maior sobre um menor. Para mover nn discos da haste AA para CC, usando BB, precisamos de mover primeiro os n−1n-1 pequenos para BB, mover o maior de AA para CC e mover os pequenos de BB para CC.

O caso n=0n=0 não faz movimentos. A recorrência para o número de movimentos é

H(n)=2H(n−1)+1,H(0)=0,H(n)=2H(n-1)+1,\quad H(0)=0,

com solução H(n)=2n−1H(n)=2^n-1. Por indução, se H(n−1)=2n−1−1H(n-1)=2^{n-1}-1, então H(n)=2(2n−1−1)+1=2n−1H(n)=2(2^{n-1}-1)+1=2^n-1.

Este número também é um limite inferior: antes de mover o maior, todos os pequenos têm de sair da sua haste e do destino; depois têm de regressar ao destino. As duas fases exigem pelo menos H(n−1)H(n-1) movimentos cada. O algoritmo atinge esse mínimo.

Não aplica o teorema mestre, pois o tamanho diminui por 1. Divisão e conquista é uma técnica de desenho, não uma garantia de custo polinomial: gerar a sequência custa Θ(2n)\Theta(2^n), embora a pilha tenha apenas profundidade nn.

Exercícios

Derivar duas recorrências

A faz três chamadas de tamanho n/3 e combina em Θ(n). B faz duas chamadas de tamanho n-1 e combina em Θ(1). Deriva a complexidade de cada um e indica onde podes aplicar o teorema mestre.

Pista

Escreve o tamanho das chamadas sem o substituir por outro formato.

Mais uma pista

Para A, n elevado a log_3 3 é n. Para B, expande os níveis que duplicam o número de chamadas.

Solução

A tem T(n)=3T(n/3)+Θ(n), caso equilibrado do teorema mestre, dando Θ(n log n). B tem T(n)=2T(n-1)+Θ(1), que não tem a forma n/b e, por isso, não admite esse teorema. A árvore de B duplica em cada um de n níveis, dando Θ(2^n) com caso base constante. Para entradas grandes, A cresce menos, mas a escolha só é válida se ambos resolverem o problema pedido.

Confere a tua resposta:

  • Escrevi as duas recorrências corretas.
  • Obtive Θ(n log n) e Θ(2^n).
  • Não apliquei o teorema mestre a B.

Erros frequentes

Trocar n-1 por n/2 altera a recorrência. Uma técnica recursiva não tem automaticamente custo logarítmico.

Voltar à explicação
Um máximo que usa as duas metades

Divide [2,-5,4,3,-2,1] depois do 4. Calcula o melhor sufixo da esquerda, o melhor prefixo da direita e a soma do melhor intervalo que atravessa a divisão.

Pista

Um sufixo tem de terminar no 4; um prefixo da direita tem de começar no 3.

Solução

O melhor sufixo é [4], soma 4, e o melhor prefixo é [3], soma 3. O cruzamento é [4,3], soma 7. O melhor intervalo da esquerda soma 4 e o da direita soma 3, portanto o cruzamento é também o ótimo global.

Erros frequentes

Usar o melhor intervalo de cada metade sem exigir sufixo/prefixo pode criar um intervalo com uma lacuna.

Voltar à explicação
Descarte seguro e patamares

Para A=[1,3,5,4,2], usa limites inclusivos lo,hi e m=⌊(lo+hi)/2⌋m=\lfloor(lo+hi)/2\rfloor. Compara A[m] com A[m+1] enquanto lo é menor que hi. Mostra os intervalos até encontrar o pico. Depois compara no meio [1,3,1,1,1,1,1] e [1,1,1,1,1,3,1]. Por que a mesma regra de descarte não serve para ambos?

Pista
Na descida, conserva m: ele próprio pode ser o pico.
Solução

Em [0,4], m=2 e 5 é maior que 4, por isso conservamos [0,2]. Agora m=1 e 3 é menor que 5; conservamos [2,2]. O pico tem índice 2 e valor 5.

Nos dois vetores com repetições, m=3 e as posições 3 e 4 contêm 1. O primeiro tem pico à esquerda; o segundo à direita. Escolher sempre o mesmo lado na igualdade perde uma das soluções. A redução para metade usava crescimento e decrescimento estritos.

Confere a tua resposta:

  • Rastreei [0,4], [0,2] e [2,2].
  • Obtive índice 2 e valor 5.
  • Mostrei picos dos dois lados da mesma comparação central.
Voltar à explicação

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.