Generalizzazioni di ricerca binaria per poset?


28

Supponiamo che io abbia un poset "S" e un predicato monotonico "P" su S. Voglio trovare uno o tutti gli elementi massimi di S che soddisfano P.

EDIT : Sono interessato a ridurre al minimo il numero di valutazioni di P .

Quali algoritmi esistono per questo problema e quali proprietà e operazioni aggiuntive richiedono su S?

Che dire di casi speciali importanti, come:

  • S è un ordine lineare, quindi la normale ricerca binaria funziona, purché si abbia un'operazione di "ricerca nel mezzo"
  • S è un reticolo
  • S è un reticolo di sottoinsieme
  • S è un reticolo multiset
  • ...

Questi ultimi due casi sembrano particolarmente importanti, ad esempio per la progettazione di esperimenti: hai un set di parametri booleani o reali e desideri trovare la più piccola combinazione possibile di essi che riproduca un modello particolare (ad esempio un test fallito).


1
Qual è il reticolo "multiset"?
Suresh Venkat,

1
È il reticolo i cui elementi sono mappature X -> N, meet è elementally min e join è elementally max. Può essere generalizzato a qualsiasi reticolo invece di N come codomain.
jkff,

Risposte:


15

Non ci ho pensato molto, quindi per favore correggimi se sbaglio.

Di ' è la larghezza del poset.w

  1. 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.wwlognP

  2. 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[n1]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:nX}2[n1]2[n1]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).


Caspita, un'idea così semplice! Grazie - Ci penserò se questo sembra ottimale o meno :)
jkff,

In realtà è anche inferiore a w log n, poiché la somma delle lunghezze delle catene è n. Immagino che il massimo sia intorno a w log (n / w).
jkff,

OK, per gli ordini lineari questo dà una ricerca binaria, per un reticolo di sottoinsieme questo dà il registro C (n, n / 2) (2 ^ n / C (n, n / 2)) ~ exp (n) * n. Non troppo veloce, ma non sembra neanche troppo ottimale, in quanto potrebbero esserci così tante risposte. Tuttavia, per trovare un sottoinsieme massimo, hai bisogno di una ricerca binaria su una sola catena: questo è fantastico e ora mi definisco stupido per non pensarci. Grazie ancora!
jkff,

2
Credo che catene disgiunti ti danno un limite inferiore di almeno w + log n (per gli algoritmi deterministici). Pensa a un avversario che "nasconde" un'unica soluzione nell'ultima catena interrogata. Un limite inferiore randomizzato di Ω ( w ) dovrebbe seguire il principio minimax di Yao. Trovare un singolo elemento con complessità w + log n potrebbe essere interessante. ww+lognΩ(w)w+logn
Sasho Nikolov,

1
@YanKingYin Un reticolo non può essere l'unione di (più di una) catene disgiunte, perché ogni due elementi deve avere un supremum. Un poset è un'unione di catene disgiunte se può essere partizionato in modo che gli elementi di parti diverse siano incomparabili e gli elementi all'interno della stessa parte ammettano un ordine totale.
Sasho Nikolov,


8

Un recente articolo di Daskalakis et al mostra che per un poset di dimensioni e larghezza w , è possibile trovare elementi minimi nel tempo O ( w n ) . La cosa interessante è che nel loro astratto, dicononwO(wn)

Sarebbe anche interessante trovare strutture dati statiche e dinamiche efficienti che svolgono lo stesso ruolo per gli ordini parziali che heap e gli alberi di ricerca binari svolgono per gli ordini totali.


Eh, suona non troppo stimolante rispetto al log (n) :) ma grazie comunque!
jkff,

Ma questo è il punto. Senza strutture di dati non è possibile ottenere il log n nemmeno per il set totalmente ordinato, poiché tutto ciò che è possibile fare è scansionare. In realtà è davvero una bella domanda cercare di trovare un equivalente BST.
Suresh Venkat,

Bene - Sto parlando della complessità in termini di numero di valutazioni del predicato P, non del predicato di confronto.
jkff,

1
In un certo senso sì, ma è ben lungi dall'essere la risposta completa, ad es. Non dà bisection per i casi 1d o 2d :) cosa suggerisci di fare con le radici?
jkff,

1
Non sono ancora sicuro. Pensare ad alta voce. Ma è un'ottima domanda.
Suresh Venkat,

4

X<y se CNF (x) non è vero e CNF (y) è vero per alcuni CNF fissi.

Inoltre, potrebbero esserci molti elementi massimi che soddisfano P, quindi anche per produrli tutti potrebbe richiedere molto tempo, quindi penso che ci sia solo la speranza di trovare un massimo.

In generale, la ricerca binaria funziona se è possibile selezionare in modo ricorsivo elementi tali che dopo essere stati lasciati con gli elementi di cui sopra o che gli elementi di cui sopra sono stati eliminati e in ogni set di questo tipo viene eliminato un rapporto fisso degli elementi.

Per esempio. se S è una griglia dimensionale fissa, esiste un algoritmo veloce: dimezza sempre una coordinata mantenendo le altre minime, quindi chiedi ad esempio nel primo passaggio (n / 2,0, ..., 0).

nd


Temo di non capire il primo paragrafo. Nella tua riduzione, hai tutte le stringhe n-bit nel poset S e sono fornite come parte dell'input? In tal caso, possiamo passare attraverso tutte le stringhe in tempo polinomiale.
Yoshio Okamoto,

1
@YoshioOkamoto: Penso che il presupposto in quel paragrafo sia che il confronto in S sia dato come un circuito booleano. (Ma questo non ha nulla a che fare con la ricerca in un poset e quindi non è interessante per me.)
Tsuyoshi Ito

@Tsuyoshi: grazie. Questo ha molto senso.
Yoshio Okamoto,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.