NP-difícil
Nota: Este artigo é sobre a classe de problemas NP-difícil. Para uma suave introdução, veja P versus NP.
NP-difícil (ou NP-hard, ou NP-complexo) na teoria da complexidade computacional, é uma classe de problemas que são, informalmente, "Pelo menos tão difíceis quanto os problemas mais difíceis em NP". Um problema H é NP-difícil se e somente se (sse) existe um problema NP-completo L que é Turing-redutível em tempo polinomial para H (i.e., L?=?TH). Em outras palavras, L pode ser resolvido em tempo polinomial por uma Máquina de Turing não determinística com um oráculo para H. Informalmente, podemos pensar em um algoritmo que pode chamar tal Máquina de Turing Não-Determinística como uma sub-rotina para resolver H, e resolver L em tempo polinomial, se a chamada da sub-rotina leva apenas um passo para computar. Problemas NP-difíceis podem ser de qualquer tipo: problemas de decisão, problemas de pesquisa ou problemas de otimização. Como conseqüências da definição, temos que (note que estas afirmações não são definições):
Um erro comum é pensar que NP em NP-difícil representa não-polinomial. Embora seja amplamente suspeito de que não existem algoritmos de tempo polinomial para problemas NP-difíceis, isto nunca foi provado. Além disso, a classe NP contém também todos os problemas que podem ser resolvidos em tempo polinomial. ExemplosUm exemplo de um problema NP-difícil é o problema de decisão da soma de subconjuntos, que é o seguinte: dado um conjunto de números inteiros, pode algum subconjunto não-vazio deste somar zero? Isso é uma questão do tipo sim/não, e acontece de ser NP-completo. Outro exemplo de um problema NP-difícil é o problema de otimização de se encontrar a rota de menor custo através de todos os nós de um grafo ponderado. Isto é comumente conhecido como o Problema do caixeiro viajante. Há também problemas de decisão que são NP-difíceis, mas não NP-completos, por exemplo, o problema da parada. Este é o problema que pergunta se "dado um programa e dada a sua entrada, ele irá executar para sempre?" Esta é uma questão do tipo sim/não, por isso este é um problema de decisão. É fácil provar que o problema da parada é NP-difícil, mas não NP-completo. Por exemplo, o problema de satisfatibilidade booleana pode ser reduzido ao problema da parada, transformando-o em uma descrição de uma máquina de Turing que tenta todos as atribuições verdadeiras e quando encontra uma que satisfaça a fórmula, ela para, caso contrário, entra em um loop infinito. Também é fácil ver que o problema da parada não está na classe NP já que todos os problemas em NP são decidíveis em um número finito de operações, enquanto o problema da parada, em geral, não é. Há também problemas NP-difíceis que não são NP-completos nem indecidíveis. Definições alternativasUma definição alternativa de NP-difícil que é usada frequentemente restringe os problemas NP-difíceis aos problemas de decisão e, em seguida, usa redução de muitos para um, de tempo polinomial, ao invés da redução de Turing. Assim, formalmente, uma linguagem L é NP-difícil se ?L'???NP, L'?=?L. Se for o caso que L está em NP, então L é chamada NP-completo. Convenção de nomeação NPO sistema de nomeação da família NP é confuso: os problemas NP-difíceis, não são todos NP, a despeito de ter NP como o prefixo do seu nome da classe. No entanto, os nomes estão agora estabelecidos e improváveis de mudar. Por outro lado, o sistema de nomeação NP- tem algum sentido mais profundo, porque a família NP é definida em relação à classe NP:
|