繁体   English   中英

保存点 (x_i, y_i) 的数据结构和查找 x_i > a & y_i > b 的所有点的过程

[英]Data structure that holds points (x_i, y_i) and a procedure to find all points that x_i > a & y_i > b

给定平面上的 N 个点 (x_1, y_1), ..., (x_n, y_n),需要描述一个包含所有点 (x_i, y_i) 的 DS 和一个过程 Farther(a, b),它将返回DS 中满足 x_i > a & y_i > b 的所有点的数量,时间复杂度为 O(log^2(n))。

我想到并尝试实现的基本上是一个 DS,它具有平面中点的两个排序数组,而第一个数组根据 x 值排序,第二个数组根据 y 值排序。 然后通过二进制搜索最小的满足 x 值来检索所有满足点很容易,然后检查这些点是否 y 值也满足。 这是直观的解决方案,但需要 O(nlogn) 时间。

不幸的是,没有设法提出更好的解决方案。

只要您不需要动态更新结构,我认为标准解决方案是部分持久的红黑树或类似的搜索树。

部分持久的数据结构是一种可以在不失去对先前版本的访问权限的情况下进行修改的数据结构。 这些在像 Haskell 这样的纯函数式语言中非常常见——因为每个对象都是不可变的,“修改”只是与旧版本共享尽可能多的数据的新版本,并且所有版本仍然可以使用。 Chris Okasaki 的红黑树很受欢迎。

所以,给定一个部分持久的红黑树,这个问题很容易解决:

  1. 按 X 倒序排列
  2. 将点插入树中,按 Y 排序,并跟踪为每个点创建的版本。

现在,当您需要找到所有 X>a 和 Y>b 的点时:

  1. 在 X 排序的点列表中进行二分搜索以找到 X>a 的最后一个。
  2. 获取关联的树版本,它只包含 X>a 的点。
  3. 从最大 Y 遍历树,如果找到 Y<=b 则停止。

就是这样——很简单,只是树结构本身有点棘手,而且很难找到某些语言的库版本。 每次搜索需要 O(log N) 时间,数据结构本身需要 O(N) 或 O(N log N) 空间,具体取决于实现。

Kd 树也可以用来解决这个问题,并且通常表现良好,尽管它们不能提供相同的复杂性保证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM