Arrays 在排序数组中查找三个元素,它们的和为第四个元素

Arrays 在排序数组中查找三个元素,它们的和为第四个元素,arrays,algorithm,search,Arrays,Algorithm,Search,我的一个朋友最近得到了这个面试问题,在我们看来,这个问题是可以解决的,但不在面试官认为可能的渐进时间范围内。问题是: 您有一个N整数数组,xs,已排序,但可能不不同。您的目标是找到四个数组索引(1)(a、b、c、d),以使以下两个属性保持不变: xs[a] + xs[b] + xs[c] = xs[d] a < b < c < d 现在还不清楚接下来该怎么做,但也许我们可以选择一些轴值p,然后搜索一个(a,b)对加上p,再搜索一个(d,c)对减去p。对于给定的P,通过从数组

我的一个朋友最近得到了这个面试问题,在我们看来,这个问题是可以解决的,但不在面试官认为可能的渐进时间范围内。问题是:

您有一个
N
整数数组,
xs
,已排序,但可能不不同。您的目标是找到四个数组索引(1)
(a、b、c、d)
,以使以下两个属性保持不变:

xs[a] + xs[b] + xs[c] = xs[d]

a < b < c < d
现在还不清楚接下来该怎么做,但也许我们可以选择一些轴值p,然后搜索一个
(a,b)
对加上p,再搜索一个
(d,c)
对减去p。对于给定的P,通过从数组两端向内搜索,在O(n)时间内进行搜索非常容易。然而,在我看来,这个问题是有N2个这样的值P,而不仅仅是其中的N个,所以我们实际上根本没有减少问题的大小:我们在做O(N)功,O(N2)次

我们在网上其他地方发现了一些相关的问题:在N2时间内是可以解决的,但需要提前确定总和;采用相同的算法,但对每个可能的和进行迭代,使我们始终处于N3

另一个相关的问题似乎是,但我不确定这里有多少东西是相关的:一个不平等而不是一个平等把事情弄混了很多,当然目标是固定的而不是变化的

那么,我们错过了什么?考虑到性能要求,这个问题到底是不可能的吗?还是有一个我们无法发现的聪明算法



(1) 实际上,所提出的问题是找到所有这样的
(a,b,c,d)
元组,并返回有多少元组的计数。但我认为,即使在规定的时间限制内找到其中一个,也已经足够困难了。

因此,一个解决方案可以是:

列出所有可能的x[a]+x[b]值,使a
key = (x[a]+x[b]) and value = (a,b).
此步骤的复杂性-O(n^2)

现在列出所有可能的x[d]-x[c]值,使d>c。同样,对于每个x[d]-x[c],通过查询来搜索散列图中的条目。我们有一个解决方案,如果存在一个条目,使得任何命中的c>b。 这个步骤的复杂性-O(n^2)*H

其中H是hashmap中的搜索时间


总复杂度-O(n^2)*H。现在H可能是O(1)。如果数组中的值范围很小,则可以执行此操作。哈希函数的选择也取决于数组中元素的属性。

如果算法必须列出满足条件的解集(即abcd),则最坏情况下的时间复杂度为O(n4)

1.可能存在O(n4)解决方案 简单的例子是一个数组,其中只有0个值。那么abcd只要它们保持有序,就拥有所有的自由。这表示O(n4)解决方案

但更一般地说,遵循以下模式的阵列具有O(n4)解决方案:

w, w, w, ... x, x, x, ..., y, y, y, ...  z, z, z, ....
每个事件的发生次数相同,并且:

w + x + y = z
然而,为了只产生解的数量,算法可以具有更好的时间复杂度

2.算法 这是已经发布的算法的一个微小变化,它不涉及H因子。它还描述了如何处理不同配置导致相同和的情况

  • 检索所有对并将它们存储在一个数组X,其中每个元素获得以下信息:

    a:两者中最小的索引
    b:另一个索引
    sum
    xs[a]+xs[b]

  • 同时,还为另一个数组中的每一对存储以下内容:

    c:两个索引中最小的索引
    d:另一个索引
    sum
    xs[d]-xs[c]

上述操作的时间复杂度为O(n²)

  • 按两个数组的元素的属性对它们进行排序。如果值等于,排序顺序将按如下方式确定:对于X数组,增加b;对于Y数组,通过减少c。排序可以在O(n²)O(n²logn)时间内完成
[编辑:我无法证明先前关于O(n²)的说法(除非做出一些假设,允许使用基数/桶排序算法,我不会假设)。如评论中所述,一般来说,具有元素的数组可以按O(n²logn²)排序,即O(n²logn),但不是O(n²)]

  • 以“串联”方式遍历两个数组以找到相等的和对。如果是这种情况,则需要检查
    X[i].b
    。如果是这样,则表示一种解决方案。但可能有很多,在可接受的时间内计算这些和需要特别小心

    m=n(n-1)/2
    ,即数组X中的元素数(也是数组Y的大小):

i=0
j=0
当iY[j]。总和:
j=j+1
其他:
#我们有一个解决方案。需要计算X和Y中具有相同和的所有其他值。
#查找Y中的最后一个匹配项并将k设置为其索引:
县=0
当kw + x + y = z