查找未排序数组中的所有对

时间:2016-09-30 07:18:06

标签: arrays algorithm time-complexity computer-science

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

|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)的算法。我也尝试过平衡二进制树,但它没有帮助我。

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

1 个答案:

答案 0 :(得分:0)

获取前N-1个条目,然后对它们进行排序。这给你最小/最大和前几对。那么对于列表中的每个后续条目,它是基于min / max匹配some,all还是none?如果它不匹配或全部匹配,则直接关闭你的对。如果匹配某些,请进行二分查找以找到截止点。然后删除第一个条目并添加新条目,使用平衡二叉树来保存排序列表。

所以你是O(N log k)。在实践中,开销将是如此之高,以至于不太可能打败天真的O(Nk)方法。