avevo questo come la domanda finale su un finale algoritmi (completato):Algoritmo per il calcolo Punto Maximal in PointSet
Dato un insieme di (x, y) punti P, lasciate M (P) l'insieme di maximal punti dato il seguente ordinamento parziale su P:
(x,y) < (x',y') if and only if x < x' and y < y'.
Così:
M({(0,0),(1,1)})={(1,1)}
M({(0,0),(0,1),(1,0)})={(0,1),(1,0)}
Fornire algoritmi che calcolano M (P) con complessità temporale O (nh), O (n log n) e O (n log h) (dove n = | P | e h = | M (P) |)
mio O (NH) algoritmo:
Declare M as a set of points
foreach p in P:
addP = true
foreach m in M:
if(p < m):
addP = false
break
if(m < p):
M.remove(m)
if(addP)
M.add(p) //doesn't add if M contains p
return M
mio O (n log n) algoritmo:
Declare M as a set of points
Sort P in reverse lexicographic order
maxY := -inf
foreach p in P:
if(p.y > maxY):
M.add(p)
maxY = p.y
return M
Che cosa è un O (n log h) algoritmo?
La mia intuizione è che si tratta di una modifica del primo algoritmo, ma che utilizza una struttura dati intelligente (forse una modifica di un albero binario) che non ha bisogno di essere scansionata per ogni punto.
Esiste un tale algoritmo per un generale poset?
Questo avrebbe trovato le foglie di qualsiasi albero orientato dato un elenco di vertici e la ricerca costante di tempo se esiste un percorso diretto tra due vertici dati.
il primo algoritmo non funziona: il ciclo interno non viene mai eseguito, perché M inizia come vuoto –
In aggiunta a ciò che @PetarIvanov ha scritto: la soluzione O (nh) è semplicemente iterata sull'intero insieme di punti e aggiungere un punto al set massimo, fino a quando non c'è più nulla da aggiungere. – amit
@PeterSmith: Ah, l'ho ricordato male. Risolto ora. – jacobhaven