У меня был последний вопрос об окончательном алгоритме (теперь завершенном):
Учитывая набор (x, y) точек P , пусть M (P) будет набором максимальным точками при следующем частичном упорядочении по P:
(x,y) < (x',y') if and only if x < x' and y < y'.
Таким образом:
M({(0,0),(1,1)})={(1,1)}
M({(0,0),(0,1),(1,0)})={(0,1),(1,0)}
Приведите алгоритмы, которые вычисляют M (P) с временной сложностью O (nh), O (n log n) и O (n log h) (где n = | P | и h = | M (P) |)
Алгоритм My O (nh):
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
Алгоритм My O (n log n):
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
Что такое алгоритм O (n log h)?
Моя интуиция заключается в том, что это модификация первого алгоритма, но с использованием некоторой умной структуры данных (возможно, модификация двоичного дерева), которую не нужно сканировать для каждой точки.
Существует ли такой алгоритм для общего poset ?
Это позволило бы найти листья любого направленного дерева, учитывая список вершин и поиск по постоянному времени,направленный путь между двумя датьn вершин.