Não pensei muito nisso, por favor, corrija-me se estiver errado.
Digamos que é a largura do poset.w
Para o poset que é a união de cadeias disjuntas, você precisa de pelo menos w log n avaliações de P aplicando apenas o limite inferior padrão na complexidade da consulta da pesquisa binária em cada cadeia.wwlognP
Como você faz comparações gratuitamente, é possível calcular uma decomposição em cadeia do poset em cadeias gratuitamente. Fazer busca binária em cada cadeia para identificar o primeiro elemento que satisfaz P . Depois, revise os elementos identificados e remova os dominados. O número de avaliações de P é O ( w log n ) . Isso identifica todos os elementos máximos, pois pode haver no máximo um elemento máximo por cadeia.wPPO(wlogn)
ADICIONADO: Na verdade, estou vendo um algoritmo recursivo simples para fazer muito melhor ( ) para a rede dos subconjuntos 2 [ n ] ( EDIT : domotor descreveu a estratégia geral em sua resposta). Aqui estou assumindo que P é monotônico para baixo (ou seja, os subconjuntos { X : P ( X ) = 1 } formam um conjunto inferior), que é o que você quer dizer. Então, aqui está o algoritmo para encontrar um membro do conjunto inferior:O(n)2[n]P{X:P(X)=1}
a) Teste . Se 0, então pare.P(∅)
b) Teste . P({n})
bi) Se 0, repita em (OK, pois nenhum conjunto contendo n pode estar no conjunto inferior).2[n−1]n
b.ii) Se 1, existe um membro do conjunto inferior no sub-retículo . Esse sublatismo é isomórfico para 2 [ n - 1 ], para que mais uma vez possamos recuar. Mais precisamente, podemos executar o algoritmo para 2 [ n - 1 ] , mas quando o algoritmo pede para avaliar P ( Y ) , avaliamos P ( X ) onde X = Y ∪ { n } .{X:n∈X}2[n−1]2[n−1]P(Y)P(X)X=Y∪{n}
Assim, em cada passo, recessamos em um sublático que é metade do tamanho do original. No geral, precisamos avaliar no máximo 2 n vezes (na verdade, você pode implementar o algoritmo para avaliar o predicado n + 1 vezes, como Yoshio aponta, já que você só precisa verificar ∅ uma vez).P2nn+1∅