计算Pointset中最大点的算法

时间:2011-12-14 07:29:43

标签: algorithm data-structures poset

我将此作为最终算法(现已完成)的最终问题:

给定一组(x,y)点 P ,让 M(P) maximal在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)|)

我的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

我的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是否有这样的算法?
这将找到任何有向树的叶子给定顶点列表和恒定时间查询两个给定顶点之间是否存在有向路径。

1 个答案:

答案 0 :(得分:6)

这是一个非常邪恶的考题(除非你的导师告诉你关于凸壳的O(n log h)算法之一,在这种情况下它只是邪恶)。

这个问题被称为2D MAXIMA,它通常是计算几何学的领域,因为它与计算凸包的关系密切。我找不到关于最大值问题的O(n log h)算法的良好描述,但是Timothy Chan's O(n log h) algorithm for 2D CONVEX HULL应该给你味道。