Eu estava lendo uma pergunta no Stack Overflow perguntando se era NP- difícil listar todos os ciclos simples em um gráfico contendo um nó específico e me ocorreu que eu não conseguia pensar em nenhuma classe de complexidade existente que fosse adequada para falando sobre problemas no formulário "liste todas as soluções para esse problema". A classe NP, em certo sentido, consiste em problemas que perguntam se existe pelo menos uma solução, a classe FNP pede para produzir uma única solução e a classe #P pede para contar quantas soluções existem, mas nenhuma delas lida com a complexidade. enumerar exaustivamente todas as soluções possíveis.
Existe uma classe de complexidade para descrever problemas com a forma "dado um predicado computável em tempo polinomial e uma string x , enumere todos os y para os quais P ( x , y ) é verdadeiro sujeito a [inserir alguns restrições de complexidade apropriadas]? " Entendo que pode ser complicado definir as restrições, uma vez que o número de soluções pode ser exponencialmente maior que o tamanho da entrada x , embora isso não pareça intransponível.
fonte
Respostas:
O conceito que você está procurando é chamado de complexidade de enumeração , que é o estudo da complexidade computacional de enumerar (listar) todas as soluções para um problema (ou os membros de um idioma / conjunto). Os algoritmos de enumeração podem ser modelados como um processo em duas etapas: uma etapa de pré - computação e uma fase de enumeração com atraso . Ambos os passos têm suas próprias complexidades de tempo e espaço (talvez entropia também). No espírito geral da complexidade, muitas vezes há trocas entre elas a serem consideradas.
A etapa de pré-computação realiza algum trabalho necessário antes da enumeração da primeira solução. Isso pode envolver a localização da solução ou a inicialização de uma grande estrutura de dados que reduzirá o atraso geral entre cada solução.
O atraso é o custo do recurso associado ao cálculo necessário entre soluções enumeradas arbitrárias. Em outras palavras, o atraso é uma medida do espaço e do tempo necessário para produzir a solução após o i t h uma. Problemas cujas soluções demoram O ( 1 ) para cada enumeração têm atraso constante. Um requisito de O ( p o l y ( n ) )i+1th ith O(1) O(poly(n)) tempo é dito ter atraso polinomial.
Para o problema de enumeração que você mencionou especificamente na sua pergunta, você deve olhar para a classe e seus irmãos relacionados no ponto 2.1 do "enumeração: Algoritmos e Complexidade", de Johannes Schmidt (Ligado na parte inferior).ENUMNP
Por que nos preocupamos com o tempo e o atraso da pré-computação?
O atraso é muito essencial para entender os verdadeiros meandros dos problemas de enumeração. Enumerando os elementos de (até o tamanho n ) e { → x : ϕ ( → x ) } onde ϕ ( → x ) é uma fórmula booleana (isto é, SAT), ambos levam tempo exponencial. No entanto, enumerando através de Σ ∗Σ∗ n {x⃗ :ϕ(x⃗ )} ϕ(x⃗ ) Σ∗ requer apenas um atraso constante, pois você pode simplesmente percorrer os elementos em alguma ordem. Pelo que sabemos, o atraso na enumeração de soluções para uma instância 3SAT pode ser exponencial. Nosso trabalho como teóricos da complexidade é captar por que o último problema é fundamentalmente mais difícil (mais complexo) do que o anterior. O atraso faz um bom trabalho em mostrar essa diferença.
Da mesma forma, também precisamos saber quanta pré-computação é feita. Podemos reduzir o atraso de qualquer problema de enumeração para tempo e espaço constantes pré-computando todas as soluções e armazenando-as em uma lista a ser enumerada posteriormente. O desafio é encontrar o melhor equilíbrio entre os dois recursos.
A ordem em que você enumera os elementos também pode influenciar a complexidade. Exigir que os resultados sejam retornados em uma ordem classificada especificada pode exigir que realizemos cálculos adicionais nas duas etapas. Embora situações em que qualquer ordem seja suficiente (desde que cada elemento enumerado seja único) também sejam certamente estudadas.
Até onde eu sei, essas classes normalmente não possuem rótulos concisos (semelhante a e N P ). Não é possível esperar que seja possível fazer isso, pois as classes de complexidade de enumeração estão manipulando em torno de 3 ou mais recursos (pré-computação / tempo total, espaço, atraso e entropia). Existem simplesmente muitas combinações de limites de recursos para distribuir nomes especiais. Isso não torna essas classes menos interessantes e também não impede os pesquisadores de tentar de qualquer maneira.P NP
Recursos
Esta pesquisa (realmente uma tentativa de formalização) deve ajudá-lo a começar. Também prova alguns teoremas básicos da hierarquia.
Enumeração: Algoritmos e Complexidade (Johannes Schmidt, 2009)
https://www.thi.uni-hannover.de/fileadmin/forschung/arbeiten/schmidt-da.pdf
Para uma enumeração de resultados na complexidade da enumeração, confira esta compilação com curadoria de Kunihiro Wasa. Como é categorizado por tipo de problema, você pode encontrar facilmente vários papéis dedicados à enumeração de ciclos de gráficos. Deve ser simples modificar os algoritmos envolvidos para considerar apenas os ciclos com um determinado nó.
http://www-ikn.ist.hokudai.ac.jp/~wasa/enumeration_complexity.html
fonte