Non ci ho pensato molto, quindi per favore correggimi se sbaglio.
Di ' è la larghezza del poset.w
Per il poset che è l'unione di catene disgiunte è necessario almeno w log n valutazioni di P semplicemente applicando il limite inferiore standard sulla complessità della query della ricerca binaria a ciascuna catena.ww lognP
Dato che dai confronti gratuitamente, puoi calcolare una decomposizione a catena del poset in catene gratuitamente. Fare ricerca binaria su ogni catena di identificare il primo elemento che soddisfa P . Quindi ripassa gli elementi identificati e rimuovi quelli dominati. Il numero di valutazioni di P è O ( w log n ) . Questo identifica tutti gli elementi massimi, poiché può esserci al massimo un elemento massimo per catena.wPPO(wlogn)
AGGIUNTO: In realtà sto vedendo un semplice algoritmo ricorsivo per fare molto meglio ( ) per il reticolo dei sottoinsiemi 2 [ n ] ( EDIT : domotor ha descritto la strategia generale nella sua risposta). Qui suppongo che P sia monotonico verso il basso (cioè i sottoinsiemi { X :O(n)2[n]P formano un insieme inferiore), che penso che tu voglia dire. Quindi, ecco l'algoritmo per trovare un membro del set inferiore:{X:P(X)=1}
a) Test . Se 0, allora fermati.P(∅)
b) Test . P({n})
bi) Se 0, quindi ricorrere su (OK, poiché nessun set contenentenpuò essere nel set inferiore).2[n−1]n
b.ii) Se 1, allora esiste un membro dell'insieme inferiore nella sublattice . Questa sublattice è isomorfa a 2 [ n - 1 ], quindi ancora una volta possiamo ricorrere. Più precisamente, possiamo eseguire l'algoritmo per 2 [ n - 1 ] , ma quando l'algoritmo chiede di valutare P ( Y ) , valutiamo P ( X ) dove X = Y ∪ { n } .{X:n∈X}2[n−1]2[n−1]P(Y)P(X)X=Y∪{n}
Quindi in ogni passaggio facciamo affidamento su una grata che è la metà di quella originale. Nel complesso, dobbiamo valutare al massimo 2 n volte (in effetti è possibile implementare l'algoritmo per valutare il predicato n + 1P2nn+1 volte come sottolinea Yoshio, dal momento che solo bisogno di controllare una volta).∅