Complexidade

Tamanho da entrada, tempo polinomial, certificados, P, NP e direção das reduções.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

A máquina de Turing que marca pares em anbna^nb^n termina, mas regressa várias vezes sobre a entrada. A complexidade mede quantos passos essas varreduras exigem quando a entrada cresce.

Esta página é uma extensão ao percurso de linguagens formais. Usa a distinção entre reconhecedor e decisor; a profundidade da avaliação atual não está confirmada. Uma cota O(f(n))O(f(n)) limita o custo por um múltiplo fixo de f(n)f(n) para entradas suficientemente grandes.

Medir o tamanho da entrada

O tamanho nn é o comprimento da codificação, não necessariamente o valor numérico descrito. Um inteiro positivo NN em binário usa ⌊log⁡2N⌋+1\lfloor\log_2N\rfloor+1 bits. Um algoritmo que faz NN passos pode ser exponencial nesse número de bits.

Por exemplo, representar 10241024 em binário precisa de 11 bits. Experimentar todos os inteiros de 11 a NN não passa a ser polinomial no comprimento da entrada só porque faz O(N)O(N) passos.

Para um decisor, o tempo no pior caso T(n)T(n) é o maior número de passos entre as entradas de comprimento nn. Numa comparação assintótica, O(nk)O(n^k), para kk fixo, é tempo polinomial. 2n2^n e n!n! não são polinomiais.

A classe polinomial mantém-se nas simulações usuais entre modelos razoáveis de computação. Isso não diz que todo o algoritmo polinomial é rápido na prática: n100n^{100} ou uma constante enorme podem torná-lo inutilizável.

O custo depende da representação

Converter uma descrição antes de decidir uma pergunta pode tornar o problema maior. Se a palavra tem comprimento nn, o autómato tem ss estados e o alfabeto é fixo:

TarefaCusto ou tamanho relevante
Simular um DFAO(n)O(n) passos com acesso direto à tabela.
Simular um NFAO(ns2)O(ns^2) numa implementação por conjuntos e tabela de destinos.
Determinizar um NFAAté 2s2^s estados; a construção pode produzir uma descrição exponencial.
Thompson para uma expressão de comprimento rrO(r)O(r) estados e arestas.
CYK para uma CFG fixa em CNFO(n3)O(n^3) tempo e O(n2)O(n^2) espaço.

Para testar uma só palavra num NFA, não precisas de materializar o DFA inteiro. Segue o conjunto de estados possíveis e evita o crescimento exponencial da conversão. São custos de tarefas diferentes, não uma contradição.

Na eliminação de estados, há um número polinomial de atualizações de rótulos, mas cada rótulo é uma expressão que pode crescer muito. Contar atualizações sem contar o tamanho das expressões não prova tempo polinomial para escrever o resultado.

P: decidir em tempo polinomial

P é a classe das linguagens decidíveis por TM determinística em tempo polinomial. A pertença a uma linguagem regular está em P: um DFA fixo lê a entrada em O(n)O(n). Para uma CFG fixa, CYK decide em O(n3)O(n^3).

Classes como P e NP definem-se para problemas de decisão, com resposta sim ou não. Um problema de otimização pode ter uma versão de decisão, por exemplo: em vez de pedir o menor percurso, perguntar se existe um percurso de custo no máximo kk.

NP: certificados verificáveis

NP contém as linguagens para as quais uma resposta sim pode ter um certificado de comprimento polinomial, verificável em tempo polinomial. Formalmente, existe um verificador VV e um polinómio pp tais que:

w∈L  ⟺  ∃c,∣c∣≤p(∣w∣) e V(w,c) aceita.w\in L\iff\exists c,\quad |c|\le p(|w|) \ \text{e}\ V(w,c)\text{ aceita}.

O verificador tem de terminar em tempo polinomial e rejeitar certificados inválidos. Para uma entrada fora da linguagem, nenhum certificado pode fazê-lo aceitar.

Num grafo não dirigido com vértices {1,2,3,4}\{1,2,3,4\} e arestas {{1,2},{2,3},{3,4}}\{\{1,2\},\{2,3\},\{3,4\}\}, a lista (1,2,3,4)(1,2,3,4) certifica um caminho hamiltoniano: visita todos os vértices uma vez e usa apenas arestas existentes. (1,3,2,4)(1,3,2,4) falha já no primeiro par, porque não existe aresta entre 1 e 3.

Não precisas de descobrir a lista para provar pertença a NP, mas não basta dizer que uma resposta sim tem alguma prova: é preciso limitar o comprimento do certificado e o tempo de verificação.

Verificador concreto com tamanho e custo

No problema do caminho hamiltoniano, a entrada ww codifica um grafo com nn vértices e mm arestas. O certificado cc é uma lista de nn vértices. Verifica a lista em O(n2)O(n^2) comparações de identificadores, cada par consecutivo numa matriz de adjacência, e rejeita se algum teste falhar.

Com vértices numerados, o comprimento ∣c∣|c| é O(nlog⁡(n+1))O(n\log(n+1)) bits. Assume uma codificação explícita do grafo que enumera todos os vértices, incluindo os isolados; assim este tamanho é polinomial em ∣w∣|w|. As comparações de identificadores custam ainda O(log⁡(n+1))O(\log(n+1)) operações de bits cada uma, e o verificador corre em tempo polinomial, rejeitando certificados inválidos.

Para ww fora da linguagem, nenhum cc passa nos dois testes. Encontrar a lista pode ser difícil; verificá-la é barato. É essa assimetria que NP formaliza.

Equivalentemente, NP é o conjunto de linguagens decididas por TM não determinística em tempo polinomial: um ramo escolhe o certificado e verifica-o. O limite temporal aplica-se a todos os ramos. NP significa tempo polinomial não determinístico, não “não polinomial”.

Relação entre P e NP

Temos P⊆NPP\subseteq NP, pois um verificador pode ignorar o certificado e correr o decisor polinomial. Continua por resolver se P=NPP=NP.

NP contém problemas fáceis, incluindo todos os de P. Dizer que um problema está em NP não prova que não tenha algoritmo polinomial. Dizer que o melhor algoritmo que conheces é exponencial também não prova esse limite inferior.

Reduções polinomiais

Escreve A≤pBA\le_p B se existe uma função ff, computável em tempo polinomial, com

x∈A  ⟺  f(x)∈B.x\in A\iff f(x)\in B.

A transformação tem de preservar respostas sim e não e produzir uma entrada de tamanho polinomial. Se B∈PB\in P, então A∈PA\in P: calcula f(x)f(x) e usa o decisor de BB.

Exemplo: satisfazer com pelo menos um verdadeiro

SAT pergunta se uma fórmula booleana tem uma atribuição que a torna verdadeira. Considera a variante que exige também que pelo menos uma variável tenha valor verdadeiro. Para transformar uma fórmula φ\varphi de SAT, cria uma variável nova zz e usa f(φ)=φ∧zf(\varphi)=\varphi\land z.

Se φ\varphi é satisfazível, prolonga a atribuição com zz verdadeiro. Se φ∧z\varphi\land z é satisfazível, a restrição da atribuição às variáveis antigas satisfaz φ\varphi. A variável nova garante a condição adicional. O tamanho aumenta apenas por uma conjunção e uma variável, logo a transformação é polinomial.

As duas implicações são a prova da redução. Exemplos isolados não substituem essa correspondência.

NP-difícil e NP-completo

Um problema BB é NP-difícil se todo o problema de NP se reduz a BB em tempo polinomial. É NP-completo se, além disso, B∈NPB\in NP.

Para provar NP-completude, descreve primeiro certificado, tamanho e verificador. Depois reduz a BB um problema já NP-completo, provando a equivalência e o custo. A transitividade das reduções transporta a dificuldade dos restantes problemas de NP.

SAT é NP-completo pelo teorema de Cook-Levin. Uma atribuição booleana é o seu certificado, mas isso só demonstra a parte SAT∈NPSAT\in NP; a dificuldade exige o outro argumento do teorema.

Se algum problema NP-completo estiver em P, então P=NPP=NP. Se um problema for apenas NP-difícil, não podes concluir que pertença a NP, nem que seja decidível. A dificuldade e a pertença são afirmações distintas.

Exercícios

Problemas originais para a extensão de complexidade. Não representam uma confirmação da profundidade da avaliação de TC.

Valor e comprimento da codificação

Um algoritmo recebe um inteiro positivo NN em binário, sem zeros iniciais, e faz exatamente NN iterações. Quantos bits usa N=1024N=1024? Para entradas com nn bits, determina o intervalo de valores de NN e explica se o número de iterações é polinomial em nn. Compara com codificar NN em unário.

Pista

O primeiro bit não nulo tem peso 2^(n−1).

Solução

1024=2101024=2^{10} escreve-se como um 11 e dez 00, usando 11 bits. Com nn bits, 2n−1≤N≤2n−12^{n-1}\le N\le2^n-1. Logo o número de iterações é Θ(2n)\Theta(2^n), exponencial no comprimento binário, apesar de ser linear no valor NN.

Em unário, NN é representado por NN cópias de um símbolo e o comprimento da entrada é NN. As mesmas NN iterações são lineares nesse comprimento. Contámos iterações; o custo interno de cada iteração pode acrescentar outros fatores.

Confere a tua resposta:

  • Obtive 11 bits para 1024.
  • Derivei as cotas 2^(n−1) e 2^n−1.
  • Distingui custo por valor, por bits e por comprimento unário.
Voltar à explicação
Descrever um certificado

Explica por que caminho hamiltoniano está em NP. Não apresentes um algoritmo que procura todos os caminhos.

Pista

O certificado pode dar o caminho que queres verificar.

Mais uma pista

Uma lista com o tamanho certo ainda pode repetir vértices ou usar uma aresta inexistente.

Solução

Usa uma lista de |V| identificadores de vértices. Confirma que todos existem, são distintos e cobrem V, e que cada par consecutivo é uma aresta. Uma lista que passa todos esses testes é um caminho hamiltoniano, e qualquer caminho hamiltoniano dá tal lista. A codificação ocupa O(∣V∣log⁡∣V∣)O(|V|\log|V|) bits com identificadores numéricos; mesmo uma verificação direta por pares e consulta da lista de arestas é polinomial na entrada.

Confere a tua resposta:

  • Escolhe uma lista de todos os vértices como certificado de tamanho polinomial.
  • Verifica pertença, ausência de repetições e cobertura de todos os vértices.
  • Verifica cada aresta consecutiva e explica o custo polinomial.

Erros frequentes

Não apresentes só testes de arestas sem verificar cobertura e repetições. Não procures o certificado para demonstrar que se pode verificá-lo.

Voltar à explicação
Provar as duas direções

Queres reduzir SAT ao problema de satisfazer uma fórmula com pelo menos uma variável verdadeira. Um colega propõe f(φ)=φ∨zf(\varphi)=\varphi\lor z, com zz nova. Explica por que falha, corrige a transformação e prova que o problema de destino é NP-completo, usando SAT como problema NP-completo conhecido.

Pista

A redução tem de preservar os não. Pergunta o que acontece quando z é verdadeira na proposta.

Mais uma pista

Usa φ=x∧¬x\varphi=x\land\neg x como contraexemplo. A conjunção com zz exige satisfazer a fórmula antiga.

Solução

A proposta falha: x∧¬xx\land\neg x não é satisfazível, mas (x∧¬x)∨z(x\land\neg x)\lor z é satisfazível escolhendo zz verdadeira. Cria uma resposta sim a partir de uma resposta não.

Usa antes f(φ)=φ∧zf(\varphi)=\varphi\land z. Se φ\varphi for satisfazível, mantém a atribuição antiga e acrescenta zz verdadeira. Se a imagem tiver uma atribuição válida, restringi-la às variáveis antigas satisfaz φ\varphi. A transformação aumenta o texto por uma variável e uma conjunção, em tempo polinomial.

O destino pertence a NP: o certificado dá um bit por variável; o verificador avalia a fórmula e confirma que existe um bit verdadeiro. O tamanho e o tempo são polinomiais na fórmula. Como SAT≤pBSAT\le_p B e SAT é NP-completo, BB é NP-difícil. Juntando pertença e dificuldade, BB é NP-completo.

Confere a tua resposta:

  • Dá uma fórmula insatisfazível cuja imagem proposta fica satisfazível.
  • Usa uma conjunção com uma variável nova e prova ambas as implicações.
  • Descreve um verificador e o tamanho do certificado para provar pertença a NP.
  • Indica a direção SAT para o problema novo e o custo polinomial.

Erros frequentes

Não proves só a implicação sim para sim. Não uses a redução como substituto da prova de pertença a NP.

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.