1. CENTRO UNIVERSITÁRIO DA FEI
ORLANDO DA SILVA JUNIOR
CLASSES DE PROBLEMAS P E NP
São Bernardo do Campo
2010
2. SUMÁRIO
1 INTRODUÇÃO .....................................................................................................................3
2 TEMPO POLINOMIAL.......................................................................................................4
2.1 Algoritmos determinísticos ..................................................................................................4
2.2 Algoritmos não-determinísticos ...........................................................................................5
2.3 Abstração..............................................................................................................................5
3 PROBLEMAS POLINOMIAIS...........................................................................................6
3.1 Averiguação de um problema polinomial ............................................................................6
3.2 Classe de problemas complexos P........................................................................................6
4 PROBLEMAS NÃO-POLINOMIAIS.................................................................................8
4.1 Problemas NP-Completos ....................................................................................................8
4.2 Demonstração pelo teorema de Cook.................................................................................10
REFERÊNCIAS .......................................................................................................................9
3. 3
1 INTRODUÇÃO
A maior parte dos problemas computacionais podem ser resolvidos com
algoritmos polinomiais, ou seja, o pior caso de um algoritmo desta natureza ainda é
solucionável computacionalmente. Os algoritmos que solucionam o problema do
quadrado perfeito, de uma equação de segundo grau ou do caminho mais curto em um
grafo pertencem a essa categoria.
Algoritmos intratáveis são aqueles cujo tempo não é polinomial. Soluções para
problemas deste tipo são dificilmente encontradas em tempo hábil. Todavia, a solução
pode existir e não ser polinomial. Neste caso, o problema é classificado como não-
polinomial.
O tempo polinomial de uma solução indica se o problema pode ser resolvido em
tempo útil, ou seja, se um computador qualquer pode tratar o problema e encontrar sua
solução. Problemas não-polinomiais, em geral, necessitam que supercomputadores
sejam utilizados para que suas instâncias sejam resolvidas. Embora uma solução ótima
possa ser encontrada, o tempo para consegui-la pode ser inestimável.
4. 4
2 TEMPO POLINOMIAL
A discussão de problemas das classes P e NP envolve também a discussão do
tempo polinomial da solução do problema. É consenso entre os pesquisadores dizer que
qualquer solução de difícil problema pode ser encontrada. Até mesmo mais de uma
solução. Todavia, todos os problemas estudados na classe NP não possuem tempo
polinomial satisfatório, o que dificulta encontrar, na prática, a solução para o problema
estudado.
Três argumentos sustentam a controvérsia de que problemas NP podem ser
considerados tratáveis (CORMEN et al, 2002):
Não existem problemas de tão alto grau. Embora problemas de alto grau
sejam considerados, não são conhecidos problemas cujas soluções atinjam
tão alto grau que não possam ser resolvidos computacionalmente. Ademais,
alto grau de tempo polinomial indica que um tempo polinomial menor pode
ser encontrado;
O mesmo tempo polinomial pode ser utilizado em diversas classes de
problemas. Dado um problema qualquer com um tempo polinomial
satisfatório, esse mesmo tempo pode ser utilizado como resolução de outro
problema qualquer em um computador distinto;
Os problemas polinomiais fecham-se em operações matemáticas básicas.
Alguns algoritmos tem propriedades de fechamento que utilizam operações
de soma, subtração, multiplicação, divisão ou composição para encontrar a
solução trivial do problema.
2.1 Algoritmos polinomiais determinísticos
No modelo formal algorítmico, a eficiência de um algoritmo é uma função de
um numero de bits utilizados para codificar a entrada utilizando um razoável esquema
de codificação (SEDGEWICK, 1990).
Por determinístico entende-se o tempo que o algoritmo leva para ser
solucionado. Neste caso, o algoritmo deve ser solucionado necessariamente, e não
apenas hipoteticamente, sendo especializado a arquiteturas de hardware.
Algoritmos polinomiais determinísticos pertencem à classe P de complexidade
de algoritmos. A classe P é o conjunto de todos os problemas que podem ser resolvidos
5. 5
por algoritmos determinísticos em tempo polinomial; em outras palavras, a classe
complexa P abrange todas as soluções para os problemas que podem ser resolvidos e
são considerados tratáveis, conforme a definição do capítulo 1.
2.2. Algoritmos polinomiais não-determinísticos
Em oposição à definição de determinístico, por algoritmo não-determinístico
entende-se o conjunto de soluções distintas segundo uma mesma entrada. Em outras
palavras, um algoritmo não-determinístico possui diversas soluções para um mesmo
problema; todavia, não é possível conhecer previamente o resultado que será fornecido
pela aplicação do algoritmo.
Os algoritmos não-determinísticos pertencem à classe NP de problemas
algoritmicamente complexos. A classe NP é o conjunto de todos os problemas que
podem ser resolvidos por um algoritmo não-determinístico em tempo polinomial
(SEDGEWICK, 1990).
2.3 Abstração
Para o propósito de compreender como funcionam os problemas de classes P e
NP, convém definir o que é um problema.
Um problema abstrato (CORMEN et al., 2002) é uma relação binária sobre um
conjunto de instâncias de problemas e um conjunto de soluções de problemas. Como
esta definição está restrita a problemas de decisão, estes podem ser vistos como
problemas abstratos que têm a função de mapear o conjunto das instâncias para o
conjunto de soluções, denotando em cada solução particular o seu caráter de
solubilidade.
O algoritmo do menor caminho em um grafo resolve um problema de decisão:
dado um grafo não-orientado com mais de dois vértices, deseja-se encontrar o caminho
de um vértice ao outro que percorra a menor quantidade de arestas. Embora seja
também um problema de otimização, o algoritmo do menor caminho averigua se tal
caminho que conecta dois vértices, de fato, existe. Este, pois, é o caráter que o define
como também sendo um problema de decisão.
6. 6
3 PROBLEMAS POLINOMIAIS
Problemas polinomiais são aqueles que podem ser solucionados em tempo
polinomial. Um algoritmo que resolve um dado problema é polinomial se o seu
consumo de tempo é limitado por uma função polinomial dos tamanhos das instâncias
do problema (FEOFILOFF, 2010).
3.1 Averiguação de um problema polinomial
Dada a definição acima, pode-se dizer que um algoritmo de tempo polinomial é
definido por suas entradas. Matematicamente, um algoritmo polinomial é assim
definido onde seu tempo é O(p(n)), onde p é alguma função polinomial e n é o tamanho
da entrada. Qualquer algoritmo cuja função de complexidade de tempo pode não ser tão
limitada é chamado de algoritmo de tempo exponencial. (GAREY; JOHNSON, 1979).
Através da máquina de Turing, foi possível dizer com maior precisão o que é um
algoritmo e como o problema resolvido por esse algoritmo é considerado computável. É
cientificamente válido dizer que um problema é computável se é resolvido pela máquina
de Turing. Satisfeita essa condição, anos depois da descoberta da existência de tal
máquina, necessitou-se saber o quão eficiente um algoritmo o é.
Sabe-se que um algoritmo deve ser computável e eficiente. Segundo as
definições apresentadas até agora, pode-se dizer que um algoritmo é eficiente se é
também polinomial (TOSCANI; VELOSO, 2002).
Todavia, para expressar a eficiência de um algoritmo, é computacionalmente
válido se utilizar de uma linguagem que verifique o algoritmo, que, por sua vez,
também é um algoritmo. Esse algoritmo que verifica a linguagem é chamado de
algoritmo de verificação.
3.2 Classe de problemas complexos P
Identificar problemas de caráter polinomial é mais simples que caracterizar um
que não seja. Um algoritmo que cresce a O(n300
) é considerado polinomial, já que sua
função não pertence ao conjunto de funções exponenciais. Embora o tempo apresentado
como exemplo possa parecer enorme quando comparado com outros algoritmos cujo
tempo é bastante inferior, uma função que possua essa taxa de crescimento, em termos
7. 7
algorítmicos, é classificada como tendo tempo polinomial aceitável. Todavida,
dificilmente existirá na prática um algoritmo que implemente uma solução em O(n300
).
A maior parte dos algoritmos existentes pertencem à classe P, como o HeapSort
e o QuickSort, que possuem Θ(nlog2n), e o BubbleSort, que possui complexidade
temporal O(n2
). É possível demonstrar facilmente que esses algoritmos fazem parte da
classe P através de suas notações assintóticas.
8. 8
4 PROBLEMAS NÃO-POLINOMIAIS
Conforme descrito no capítulo 2.2, problemas polinomiais pertencem à classe de
complexidade NP e estão relacionados a algoritmos que podem ser verificados em
tempo polinomial. Neste caso, o tempo polinomial é não-determinístico, fazendo revés
com os algoritmos mais comuns e utilizados, que são determinísticos. Mais
especificamente, a classe NP é a classe de linguagens que podem ser verificadas (cf.
cap. 3.1) em tempo polinomial.
A relação entre P e NP é um problema ainda em aberto na ciência da
computação. Embora se saiba que P ⊆ NP, a maioria dos pesquisadores desacredita que
P = NP.
A primeira relação é explicada da seguinte forma: dada uma linguagem L que
pertence a NP quando existe um algoritmo de tempo polinomial de duas entradas A e
uma constante c, é possível conhecer um algoritmo de verificação de dois argumentos
que ignore todo e qualquer certificado e aceite as cadeias de entrada contidas em L
(CORMEN et al., 2002).
A segunda relação apresentada é bastante divergente na ciência da computação.
Por muitos pesquisadores acreditarem mais que P ≠ NP do que P = NP, uma outra classe
de problemas passou a ser estudada, a classe de linguagens NP-Completas.
4.1 Problemas NP-Completos
Alguns autores afirmam que a classe NP-Completo de algoritmos tem uma
propriedade bastante interessante intrínseca a ela (CORMEN et al., 2002 e TOSCANI;
VELOSO, 2002), a confirmar a existência de um tempo polinomial para qualquer
problema da classe NP. Em outras palavras, P = NP.
9. 9
Figura 1 - Relação de conjuntos entre a complexidade dos problemas
É comum, no processo de solução de um problema a, reduzi-lo a outro problema
b. Isto significa que dada uma instância de a, deve-se construir uma instância de b, tal
que a solução da instância de a determine a solução da instância de b correspondente.
As reduções deste tipo que preservam a complexidade polinomial são chamadas de
reduções polinomiais.
Para que ocorra a redução polinomial de uma linguagem L1 para uma linguagem
L2, há uma função f que satisfaz as seguintes condições:
Existe um programa para a máquina determinística de Turing de
complexidade polinomial que computa f;
Para todo x pertencente ao conjunto de instâncias de L1, x também
pertence a L1 de modo que f(x) pertença a L2.
Se existe uma redução polinomial de L1 em L2, diz-se que L1 é redutível a L2.
10. 10
Figura 2 - Modelo gráfico da máquina de Turing
4.2 Demonstração pelo Teorema de Cook
O primeiro problema a ser considerado NP-Completo foi provado pelo cientista
americano Stephen Cook, em 1971. Cook deu uma prova do que é satisfatoriamente
algo NP-Completo ao dizer que se existe um algoritmo de tempo polinomial que
satisfaça as condições em NP-Completo, então todos os problemas em NP podem ser
solucionados em tempo polinomial (COOK, 1971).
Para demonstrar a complexidade do tipo NP-Completo, Cook demonstra, através
de um modelo da máquina de Turing, que é possível resolver qualquer problema em
NP. Por uma demonstração totalmente matemática, o cientista adicionou o não-
determinismo à máquina a fim de que ela pudesse solucionar qualquer problema em NP.
Em seguida, definiu todas as características que a máquina deveria ter para que
resolvesse os problemas. A maneira como a máquina executaria as instruções também
foi colocada à prova no artigo, já que a solubilidade do problema estaria descrita em
fórmulas matemáticas. Cook finaliza sua demonstração afirmando que a solução para a
satisfabilidade (SAT – Boolean Satisfiability Problem) do problema corresponderia
essencialmente à simulação da máquina em execução.
11. 11
A solução gerada pela máquina cria uma instância do problema (cf. cap. 4.1),
tornando-o, assim, característico da classe de complexidade NP-Completo, conforme a
definição.
12. 12
REFERÊNCIAS
FEOFILOFF, Paulo. Introdução informal à complexidade de problemas. In: Análise de
Algoritmos. Disponível em: <http://www.ime.usp.br/~pf/algoritmos/aulas/hpsrt.html>.
Acesso em: 16 mai 2010.
COOK, Stephen A. The Complexity of Theorem-Proving Procedures. University of
Toronto Papers, Canadá, 1971.
CORMEN, Thomas et al. Algoritmos: teoria e prática. Rio de Janeiro: Elsevier, 2002.
cap. 34.
GAREY, M. R.; JOHNSON, D. Computers and Intractability - A Guide to the
Theory of NP-Completeness. USA: W. H. Freeman, 1979.
SEDGEWICK, Robert. Algorithms in C. USA: Addison-Wesley, 1990.
TOSCANI, Laira V.; VELOSO, Paulo A. S. Complexidade de Algoritmos: análise,
projeto e métodos. Porto Alegre: Editora Sagra Luzzatto, 2002. cap. 6. pag. 171-195.