我遇到了一个编程问题,我必须找到给定未排序数组中的所有对,以便
|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)
的算法。我也尝试过平衡二进制树,但它没有帮助我。
编辑:如果我们必须找出这样的对是否在数组中退出(这意味着只有一对这样),我们能做些好事。
答案 0 :(得分:0)
获取前N-1个条目,然后对它们进行排序。这给你最小/最大和前几对。那么对于列表中的每个后续条目,它是基于min / max匹配some,all还是none?如果它不匹配或全部匹配,则直接关闭你的对。如果匹配某些,请进行二分查找以找到截止点。然后删除第一个条目并添加新条目,使用平衡二叉树来保存排序列表。
所以你是O(N log k)。在实践中,开销将是如此之高,以至于不太可能打败天真的O(Nk)方法。