【问题标题】:Computing the union and intersection of two unsorted arrays in O(nlogm) time在 O(nlogm) 时间内计算两个未排序数组的并集和交集
【发布时间】:2018-11-02 14:09:57
【问题描述】:

需要帮助用算法解决这个问题... 给定两个集合 A 和 B,分别具有 m 和 n 个元素,来自线性顺序。这些集合不一定是排序的。还假设 m ≤ n。展示如何在 O(nlogm) 时间内计算 A∪B 和 A ∩ B。

【问题讨论】:

  • 其实你可以比O(n * log m)用HashMap做得更好。
  • @vivek_23 或更糟,具体取决于您的哈希密钥生成策略。在最坏的情况下,如果你有太多的碰撞,你运行的时间复杂度可能会下降到 O(n * m)。
  • @nellex 同意,但我认为该语言提供的地图功能会实现强大的哈希函数以减少冲突。

标签: algorithm set time-complexity array-algorithms


【解决方案1】:

正如 vivek_23 所说,您可以使用高概率的哈希表做得更好。

但是,要实现O(n log m),并且假设你的集合存储为数组,你可以在中排序A em>O(m log m) time 然后对B的每个元素做n二分查找,看是否是也在A中。每次查找需要 O(log m) 时间,总共需要 O(n log m) 时间。

所以,对于A∪B,你可以将A复制到一个新的集合CO(m)时间>时间。然后对于 B 的每个元素,您在 A 上进行查找(二进制搜索)。如果它不在 A 中,则将其添加到 C。这样,您将花费 O(m + n log m) 构造时间 CO(m log m)* 对 A 进行排序。由于 m ,总时间是O(n log m),随心所欲。

对于 A ∩ B,您将从一个空集 D 开始。对于 B 的每个元素,您在 A 中进行查找。如果它存在,您会将其添加到 D。完成后,您将在 A 上进行 n 次查找,总共 (n log m)。

如果您要将列表 A 的所有元素插入到哈希表中而不是对它们进行排序,那么您可以在 O(m + n) 时间内完成所有操作。

【讨论】:

  • +1,但回复:“您可以使用高概率的哈希表做得更好”:这仅在您具有对该元素类型进行操作的适当哈希函数时才有效。问题没有具体说明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
  • 2020-12-04
  • 2018-03-20
  • 2019-07-26
  • 2013-04-20
  • 2021-11-29
相关资源
最近更新 更多