Respostas:
Você não pode resolvê-lo no tempo para qualquer constante , a menos que a Hipótese do Tempo Exponencial Forte seja falsa.
Ou seja, se tivéssemos um algoritmo tal, nós poderia resolver -variável CNF satisfabilidade em tempo para alguns . O motivo é que poderíamos dividir as variáveis em duas partes iguais e de variáveis cada. Para cada parte, construímos uma família e respectivamente, de subconjuntos das cláusulas da seguinte maneira. Para cada atribuição, adicionamos um subconjunto que consiste nas cláusulas não satisfeitas pela atribuição. Essa construção é executada no tempo .
Para finalizar a construção, observamos que a instância CNF original tem uma solução se houver um subconjunto em que não esteja associado a algum subconjunto em F_2 .
Adicionando alguns elementos extras ao seu conjunto de base, além dos de cada cláusula, não é muito difícil incorporar esse problema de disjunção como uma questão de inclusão de conjunto. Você basicamente aceita os complementos dos subconjuntos em . Para garantir que dois conjuntos em não sejam contados como uma inclusão, adicione um código de uma anti-cadeia aos elementos extras. Outro código anti-cadeia (em outros elementos extras do conjunto de referência) é usado nos subconjuntos de para garantir que nenhum par de subconjuntos de uma inclusão. Finalmente, todos os conjuntos formados a partir de incluem todos os elementos dos anti-cadeia de .F 1 F 2 F 2 F 1 F 2
Esta é uma pergunta de inclusão de conjuntos em subconjuntos em um conjunto de bases . O argumento basicamente remonta a um artigo anterior de Ryan Williams (não me lembro qual). d = p o l y ( n )
Se você estiver interessado em definir famílias com , uma outra solução conceitualmente muito semelhante à descrita na resposta de Yuval é calcular a transformação zeta
onde é a função indicadora da família de entrada . Isto é, se e de outro modo. Claramente, existem conjuntos tais que se e somente se para alguns .F = { S 1 , S 2 , ... , S n } f ( S ) = 1 S ∈ F f ( S ) = 0 S i ≠S i ⊆ S j f ζ ( S ) > 1 S ∈ F
A transformada zeta pode ser calculada no tempo usando o algoritmo de Yates, veja, por exemplo, TAOCP de Knuth, vol. 2, §4.6.4. O algoritmo em si é uma programação dinâmica bastante direta e é fácil modificá-lo para dar um exemplo de um conjunto incluído, se houver.
Esse problema pode ser resolvido usando um algoritmo para multiplicação rápida de matrizes, e eu também suspeito que seja equivalente computacionalmente à multiplicação de matrizes (embora eu não conheça nenhuma maneira de provar isso e não pense que existem técnicas para provar isso) ) Essa solução teria um tempo de execução de O (n ^ {2.373}) quando n = d e outros tempos de execução para outras relações entre d e n.
Aqui está como você o resolve usando a multiplicação de matrizes: Você escreve os vetores característicos dos conjuntos nas linhas de uma matriz n por d A e os vetores característicos dos complementos dos conjuntos nas colunas de anúncio pela matriz n. multiplique A por B. Os pares de conjuntos que se cruzam são exatamente os locais do produto A * B que são iguais a zero.
Para obter o melhor tempo de execução conhecido para esse problema, consulte o artigo de Huang e Pan sobre o assunto. Se bem me lembro, quando d se torna grande o suficiente, o tempo de execução se tornará o obviamente ótimo (nd). Para n = d, você terá um tempo de execução de O (n ^ {2.373}). Para outras relações de n e d, você obterá outros valores. Se existir um algoritmo ideal para multiplicação de matriz retangular, você obterá um algoritmo com tempo de execução O (n ^ 2 + nd) para o seu problema. Suspeito que não exista uma maneira melhor do que essa para solucionar seu problema, mas estou longe de ter certeza.
Essa solução provavelmente não é útil, pois as constantes desses algoritmos são muito grandes. O algoritmo de Strassen pode melhorar a solução ingênua para valores razoáveis de n e d, mas nem tenho certeza disso. No entanto, problemas que parecem tão relacionados à multiplicação de matrizes raramente têm algoritmos combinatórios melhores que o algoritmo ingênuo (por mais de fatores polilogarítmicos); portanto, se eu tivesse que adivinhar, acho que não há um bom algoritmo para o seu problema que é significativamente melhor que o ingênuo, usando as técnicas atuais.
Se , sabemos que o conjunto não é um antichain pelo lema de Sperner, e assim o versão de decisão do problema se torna trivial. Mas pode ser interessante considerar o caso em que é próximo desse valor.
O trabalho de Friedgut no teorema de Erdős-Ko-Rado mostra que, dado o vetor característico de uma família de subconjuntos de , pode-se encontrar no tempo se é uma família que se cruza (a cada dois elementos de interseção). De maneira mais geral, seu método permite calcular que é uma função conhecida (específica) que não é zere somente se forem disjuntos. depende apenas do histograma de , onde é o indicador de .
(Como um aparte, comentamos que seu método também funciona se recebermos duas famílias , e estivermos interessados em . Nos dois casos, precisamos calcular as transformadas de Fourier-Walsh enviesadas de para um arbitrário e, em seguida, , em que depende apenas do peso de Hamming de .)
Como tudo isso se relaciona com o problema em questão? Considere a família Todo é separado de todos os . Como é dado explicitamente, podemos calcular a contribuição desses pares para . Existem mais pares disjuntos? Se estiver separado de então e, portanto, . Então é um antichain iff
Esse algoritmo é executado no tempo , ignorando os fatores polinomiais em . Quando está próximo de , isso é significativamente melhor que . Em geral, obtemos uma melhoria desde que .dn
Dado que sabemos que existe um par satisfazendo , como o encontramos? Suponha que todos os conjuntos em dois grupos aleatoriamente. Com probabilidade aproximadamente , os conjuntos e vão encontrar-se no mesmo grupo. Se estamos tão sorte, podemos executar nosso algoritmo em e , encontrar em que se fazem estes pertencem a, e assim reduzir pela metade o número de conjuntos que temos de considerar. Caso contrário, podemos tentar novamente. Isso mostra que, com um número esperado de chamadas oracle para a versão de decisão, podemos realmente encontrar um par que satisfaça .S 1 , ... , S n L 1 , L 2 1 / 2 S i
Também podemos derandomizar o algoritmo. Sem perda de generalidade, suponha que . Em cada etapa, particionamos de acordo com cada um dos bits. Uma dessas partições sempre colocará e na mesma parte, a menos que tenham polaridades opostas; podemos testar isso explicitamente usando apenas operações . Isso fornece um algoritmo determinístico usando chamadas oracle para a versão de decisão. k x y O ( n d ) O ( log 2 n )