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

Arrays 查找未排序数组中的所有对,arrays,algorithm,time-complexity,computer-science,Arrays,Algorithm,Time Complexity,Computer Science,我在find中遇到了一个编程问题,我必须找到给定未排序数组中的所有对 |i - j| <= K and |A[i] - A[j]| <= x 回答:(5,4)、(5,8)、(4,3) 我已经尝试过很多次了,但是没有想到任何算法的时间复杂度小于O(nk)。我也尝试过平衡二叉树,但它对我没有帮助 编辑:如果我们必须找到这样的对是否存在于数组中(这意味着只有一个这样的对),我们能做些好事吗。这将为您提供最小/最大和前几对。那么,对于列表中的以下每个条目,它是否与基于最小值/最大值的部分

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

|i - j| <= K and |A[i] - A[j]| <= x 
回答:
(5,4)、(5,8)、(4,3)

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


编辑:如果我们必须找到这样的对是否存在于数组中(这意味着只有一个这样的对),我们能做些好事吗。这将为您提供最小/最大和前几对。那么,对于列表中的以下每个条目,它是否与基于最小值/最大值的部分、全部或无匹配?如果不匹配或全部匹配,则直接获得配对。如果它与某些匹配,则进行二进制搜索以找到截止点。然后删除第一个条目并添加新条目,使用平衡二叉树保存已排序的列表


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

获取前N-1个条目,并对它们进行排序。这将为您提供最小/最大和前几对。那么,对于列表中的以下每个条目,它是否与基于最小值/最大值的部分、全部或无匹配?如果不匹配或全部匹配,则直接获得配对。如果它与某些匹配,则进行二进制搜索以找到截止点。然后删除第一个条目并添加新条目,使用平衡二叉树保存已排序的列表


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

考虑到输出大小本身可以是
O(nk)
,对于最坏情况的性能,您不会比
O(nk)
更好。考虑下面的数组,例如:<代码> [1,1,1,…,1 ] < /Cord> > < <代码> x>代码>谢谢。如果我必须找出是否存在这样的对,我们能做得更好吗?考虑到输出大小本身可以是
O(nk)
,对于最坏情况的性能,您不会比
O(nk)
更好。考虑下面的数组,例如:<代码> [1,1,1,…,1 ] < /Cord> > < <代码> x>代码>谢谢。如果我必须找出是否存在这样的一对,我们能做得更好吗。在每个步骤中,对新项目进行配对测试,然后删除最旧的项目,并将新项目添加到窗口中。为了提高大型窗口的效率,将对窗口进行排序。一个C++集是为这个任务而设计的,它使一个动态变化的列表总是被排序。在每个步骤中,对新项目进行配对测试,然后删除最旧的项目,并将新项目添加到窗口中。为了提高大型窗口的效率,将对窗口进行排序。C++集是为这个任务而设计的,它使一个动态变化的列表总是被排序。
 A = {5,4,8,3} and x = 3 and k = 2.