O comentário de Emil Jerabek é um bom resumo, mas eu gostaria de salientar que existem outras classes com definições mais claras que capturam mais ou menos o mesmo conceito e esclarecem a relação entre todas essas coisas.
[Aviso: embora acreditei ter acertado as definições, algumas das coisas abaixo refletem minhas preferências pessoais - tentei esclarecer onde ficava.]
No mundo determinístico, uma classe de função é apenas uma coleção de funções (no sentido matemático usual da palavra "função", isto é, um mapa ). Ocasionalmente, queremos permitir "funções parciais", cuja saída é "indefinida" para determinadas entradas. (Equivalentemente, funções definidas em um subconjunto de vez de todas elas.)Σ *Σ∗→Σ∗Σ∗
Infelizmente, existem duas definições diferentes para flutuando, e até onde eu sei, elas não são equivalentes (embora sejam equivalentes "moralmente").FP
- F P F N P , T F N PFP (definição 1) é a classe de funções que podem ser calculadas em tempo polinomial. Sempre que você vê e não está em um contexto em que as pessoas estão falando sobre , esta é a definição que assumo.FPFNP,TFNP
No mundo não determinístico, as coisas ficam um pouco engraçadas. Lá, é conveniente permitir "funções parciais e com vários valores". Seria natural chamar isso de relação binária , isto é, um subconjunto de . Mas, do ponto de vista da complexidade, muitas vezes é filosófica e mentalmente útil pensar nessas coisas como "funções não determinísticas". Acho que muitas dessas definições são esclarecidas pelas seguintes classes (cujas definições são completamente padronizadas, se não muito conhecidas):Σ∗×Σ∗
x x x { ( x , y ) : y é de saída por um ramo do cálculo na entrada x }NPMV : A classe de "funções parciais com vários valores" computáveis por uma máquina não determinística em tempo polinomial. O que isto significa é que existe uma máquina não determinística politempo e, na entrada , em cada ramificação não determinística, ela pode optar por aceitar e produzir alguma saída, ou rejeitar e não produzir saída. A saída "com vários valores" na entrada é então o conjunto de todas as saídas em todas as ramificações não determinísticas quando fornecido como entrada. Observe que este conjunto pode estar vazio; portanto, como uma "função com valores múltiplos", isso pode ser apenas parcial. Se pensarmos nisso em termos de relações binárias, isso corresponde à relação .xxx{(x,y):y is output by some branch of the computation on input x}
N P M V xNPMVt : total de "funções" em , ou seja, em cada entrada , pelo menos um ramo aceita (e, portanto, produz uma saída, por definição)NPMVx
N P M V Σ ∗NPSV : funções de valor único (potencialmente parcial) em . Há alguma flexibilidade aqui, no entanto, em que várias ramificações podem aceitar, mas se qualquer ramificação aceitar, todos os ramos aceitantes devem ter a garantia de obter a mesma saída (para que realmente tenha um valor único). No entanto, ainda é possível que nenhum ramo aceite, portanto a função é apenas uma "função parcial" (isto é, não definida em todos os ).NPMVΣ∗
N P S V Σ * → Σ * N P S V t = F P N P ∩ C O N PNPSVt : funções totais de valor único em . Essas realmente são funções, no sentido usual da palavra, . É um exercício não muito difícil ver que (usando Def 1 para FP acima).NPSVΣ∗→Σ∗NPSVt=FPNP∩coNP
Quando falamos sobre funções potencialmente com vários valores, falar sobre contenção de classes de complexidade não é mais útil: incondicionalmente, simplesmente porque não contém quaisquer "funções" com vários valores, mas funciona. Em vez disso, falamos sobre "contenção-c", denotado . Uma função (potencialmente parcial, com vários valores) refina uma função (potencialmente com valores múltiplos parciais) se: (1) para cada entrada para a qual produz alguma saída, o mesmo acontece com e (2) as saídas de são sempre um subconjunto das saídas deNPMV⊈NPSVN P M V ⊆ c f g x g f f g N P M V N P S V N P M V ⊆ c N P S VNPSVNPMV⊆cfgxgffg . A pergunta correta é, então, se todos os "função" tem um refinamento. caso, escrevemos .NPMVNPSVNPMV⊆cNPSV
- F : D → Σ * D ⊆ Σ * P F x ∈ D f ( x ) x ∉ DPF (um pouco menos padrão) é a classe de funções (potencialmente parciais) computáveis em poli-tempo. Ou seja, uma função ( ) está em se houver uma máquina determinística de politempo tal que, nas entradas o a máquina produz , e nas entradas a máquina não produz nenhuma saída (/ rejeita / diz "não" / da forma que desejar).f:D→Σ∗D⊆Σ∗PFx∈Df(x)x∉D
FNP é uma classe de "problemas de função" (em vez de uma classe de funções). Eu também chamaria "classe relacional", mas, na verdade, quaisquer que sejam as palavras usadas para descrevê-las, você precisará se esclarecer posteriormente, e é por isso que não sou particularmente parcial com essa definição. Para qualquer relação binária há um "problema de função" associado. O que é um problema de função? Não tenho uma definição matemática limpa da mesma maneira que faço para linguagem / função / relação; em vez disso, é definida pelo que é uma solução válida: uma solução válida para o problema da função associada a é qualquer função (potencialmente parcial) modo que seFNPR⊆Σ∗×Σ∗Rf(∃y)[R(x,y)]f gera qualquer , e, de outro modo, não produz saída. é a classe de problemas de função associados às relações tais que (quando considerada como uma linguagem de pares) e é equilibrada em p. Portanto, não é uma classe de funções, nem uma classe de linguagens, mas uma classe de "problemas de função", onde "problema" aqui é definido aproximadamente em termos do que significa resolvê-lo.yfFNPRR∈PFNP
TFNP é então a classe de problemas de função em - definida por uma relação como acima - esse é total, no sentido de que para cada existe um tal que .FNPRRxyR(x,y)
Para não precisar escrever coisas como "Se todo problema de função (resp., ) tiver uma solução em (resp., acordo com o acima) definição), então ... "neste contexto, utiliza-se a definição 2 de , que é:FNPTFNPPFFPFP
- FP (definição 2) é a classe de problemas de função em que possuem uma solução de tempo polivalente. Pode-se supor que a solução (= função) aqui seja total, escolhendo uma string especial que não seja um válido para qualquer e tendo a função saída quando, caso contrário, não haveria válido . (Se necessário, podemos modificar a relação acrescentando cada com 1 e, em seguida, considerar a string 0; isso não altera a complexidade de nada envolvido).FNPy0yxy0yRyy0
A seguir, como essas várias definições se relacionam: (definição 2, que é o que você deve assumir porque está em um contexto em que está sendo comparado com ) é equivalente para . (def 2) é equivalente a (def 1).FNP⊆FPFNPNPMV⊆cPFTFNP⊆FPNPMVt⊆cFP