【问题标题】:Find all pairs in an unsorted array查找未排序数组中的所有对
【发布时间】:2017-02-08 16:42:11
【问题描述】:

我在 find 中遇到了一个编程问题,我必须在给定的未排序数组中找到所有对,这样

|i - j| <= K and |A[i] - A[j]| <= x 

例如:

 A = {5,4,8,3} and x = 3 and k = 2.

回答:(5,4), (5,8), (4,3)

我尝试了很多次,但想不出任何时间复杂度低于O(nk)的算法。我也尝试过平衡二叉树,但它对我没有帮助。

编辑:如果我们必须找出这样的对是否存在于数组中(这意味着只有一对),我们能做点好事吗?

【问题讨论】:

  • 考虑到输出大小本身可以是O(nk),对于最坏情况的性能,你不会比O(nk) 更好。例如,考虑以下数组:[1,1,1,....,1] 与任何 x
  • 谢谢stackoverflow.com/users/572670/amit。如果我必须找出是否存在这样的一对,我们能做得更好吗?

标签: arrays algorithm time-complexity computer-science


【解决方案1】:

获取前 N-1 个条目,并对它们进行排序。这给了你最小/最大和前几对。那么对于列表中的每个后续条目,它是根据最小值/最大值匹配一些、全部还是不匹配?如果它不匹配或全部匹配,则您将直接配对。如果它匹配一些,请进行二进制搜索以找到截止点。然后删除第一个条目并添加新条目,使用平衡二叉树来保存排序列表。

所以你是 O(N log k)。在实践中,开销会非常高,以至于不可能击败简单的 O(Nk) 方法。

【讨论】:

  • 您在数据中运行一个滑动窗口。在每个步骤中,都会对新项目进行成对测试,然后删除最旧的项目,并将新项目添加到窗口中。为了使大窗口高效,窗口保持排序。为这个任务设计了一个 C++ 集合——它保持一个动态变化的列表总是排序的。
猜你喜欢
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2018-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-02
相关资源
最近更新 更多