【问题标题】:You are given a set of intervals S. You have to find all intervals in S that are contained in a given interval (a, b) in minimum time complexity给定一组区间 S。您必须以最小时间复杂度找到 S 中包含在给定区间 (a, b) 中的所有区间
【发布时间】:2013-08-12 03:59:50
【问题描述】:

给你一组间隔S。您必须以最小的时间复杂度找到S 中包含在给定区间(a, b) 中的所有区间。

这可以通过蛮力在O(n) 时间内完成,其中n 是集合S 中的间隔数。但是如果我被允许做一些预处理,这可以在少于O(n) 的时间内完成吗? O(log n)时间?

最初我在考虑interval tree,但我认为它不适用于这里,因为区间树用于获取与给定区间重叠的所有区间。

【问题讨论】:

  • 如上所述,您能做的最好的事情是O(n),因为在最坏的情况下,S 的所有元素都必须复制到输出中。
  • 是的,这是真的。但我希望像 O(logn) + O(m) 这样的东西,其中 m 是输出中的元素数。
  • @SteveM 请注意,就大 O 表示法而言,O(logn)+O(m) = O(n),因为 m 可以和 n 一样大。预处理时间也包含在运行时中,因为如果您想对间隔进行排序或使用某些数据结构排列它们,这些也是您算法的一部分。

标签: algorithm search data-structures tree intervals


【解决方案1】:

您可以在 2D 平面中重塑您的问题。让每个区间的(begin, end) 为一个二维点。 (请注意,所有有效间隔都将在对角线上方结束)

您的区间搜索问题转换为经过充分研究的正交 2D 范围查询,算法具有 或 运行时间,其中 k 是报告的点数。

【讨论】:

  • 好主意,但我不知道任何复杂度小于 O(k) 的算法,其中 k 是报告的点数。因此,Patricia 是对的。
  • 是的,这是真的。我已经更新了我的答案以包括对 k 的描述。但有时数据点分布良好,您的查询仅涵盖一小部分,因此摊销 k
【解决方案2】:

Persistent binary search tree 可以在这里使用。

预处理:

  1. 创建空的持久树。它应该存储按结束点排序的间隔。
  2. 按起点对区间进行排序。
  3. 对于每个间隔,从排序列表的末尾开始,创建持久树的“副本”并将此间隔添加到此副本。

搜索:

  1. 在排序列表中查找查询区间的起点。
  2. 从最小键到查询间隔结束迭代持久树的相应“副本”。

搜索时间复杂度为 O(log(n) + m),其中 m 是输出中的元素数。

【讨论】:

  • 看来它的空间复杂度是O(n^2)。如果我错了,请纠正我。
  • @SteveM:空间复杂度为 O(n*log(n))。持久数据结构允许进行浅层“副本”,其中大部分数据在“副本”之间共享,因此每次 BST 更新只需要 O(log(n)) 个额外的节点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
相关资源
最近更新 更多