Correção, invariantes e complexidade

Provar o que um algoritmo calcula e contar tempo e memória em função da entrada.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Prova em quatro passos

  • Contrato: pré-condição do chamador e pós-condição do algoritmo, com empates e vazio decididos.
  • Invariante vale à entrada de cada iteração. Mostra início, manutenção e implicação à saída.
  • Junta quantidade inteira não negativa que diminui para garantir paragem. Sem ela, tens correção parcial.

Primeira posição do máximo em vetor não vazio:

melhor = 0
para i = 1, ..., n-1:
    se v[i] > v[melhor]: melhor = i
devolver melhor

Invariante: melhor é a primeira posição do máximo em [0,i). Fecha com i=n. Usa > para conservar o primeiro; >= daria o último. São n-1 comparações.

Contar sem adivinhar

PadrãoTotalOrdem
Seguidos de n2nΘ(n)\Theta(n)
Encaixados de n, n interiores por exteriorn2n^2Θ(n2)\Theta(n^2)
1+…+nn(n+1)/2n(n+1)/2Θ(n2)\Theta(n^2)
Duplicar de i=1 enquanto i<n, n>=1⌈log⁡2n⌉\lceil\log_2 n\rceil iteraçõesΘ(log⁡n)\Theta(\log n)
Duplicar com interior i<2n<2nΘ(n)\Theta(n)

Ciclos seguidos somam os custos; ciclos encaixados com interior independente multiplicam as contagens, e o caso triangular soma 1+…+n. Copiar n posições custa Θ(n)\Theta(n). Percorrer uma string de comprimento L custa Θ(L)\Theta(L) por passagem; juntar com += repetido recopia o acumulado em cada passo, por isso fixa a operação antes de contar.

Limites e recorrências

  • OO limita por cima, Ω\Omega por baixo, Θ\Theta pede os dois. Indica sempre o caso: OO não significa pior caso.
  • 3n2+7n+43n^2+7n+4 cabe entre 3n23n^2 e 14n214n^2 para n≥1n\ge1: Θ(n2)\Theta(n^2).
  • Ordem usual: 1≺log⁡n≺n≺nlog⁡n≺n2≺2n≺n!1\prec\log n\prec n\prec n\log n\prec n^2\prec2^n\prec n!.
RecorrênciaResultado
2T(n/2)+Θ(n)2T(n/2)+\Theta(n)Θ(nlog⁡n)\Theta(n\log n)
2T(n/2)+Θ(1)2T(n/2)+\Theta(1)Θ(n)\Theta(n)
T(n/2)+Θ(1)T(n/2)+\Theta(1)Θ(log⁡n)\Theta(\log n)
T(n−1)+Θ(n)T(n-1)+\Theta(n)Θ(n2)\Theta(n^2)

Pilha recursiva ocupa O(h)O(h). Média exige distribuição; amortizado limita sequências sem sorteio. Vetor que duplica dá O(1)O(1) amortizado por inserção.

Somas rápidas

Prefixos p[0]=0p[0]=0, p[i+1]=p[i]+v[i]p[i+1]=p[i]+v[i] dão soma de [l,r) como p[r]−p[l]p[r]-p[l]. Construção Θ(n)\Theta(n), consulta Θ(1)\Theta(1).

  1. Vetor
    4-271
    [1,3) soma -2 e 7.
  2. Prefixos
    042910
    5 vem de 9 menos 4.
Cada fronteira guarda a soma do prefixo anterior.
  • Janela fixa K: desliza a soma em Θ(N)\Theta(N). «Metade ou mais» testa 2*dentro>=K.
  • Kadane para intervalo não vazio: atual=max(x,atual+x), melhor=max(melhor,atual). Tempo O(n)O(n). Só negativos devolvem o maior elemento.

Provas completas.

À 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.