Algorithm O(NlogN)查找数组中任意T和的3个数

Algorithm O(NlogN)查找数组中任意T和的3个数,algorithm,Algorithm,给定一个整数数组,找出其中任意3个和任意给定的T之和 我在一些在线帖子上看到了这一点,声称它有一个O(NlogN)解决方案 对于2个数字,我知道哈希表可以帮助O(N),但对于3个数字,我找不到一个 我也觉得这个问题听上去对一些棘手的问题很熟悉,但我记不起它的名字,因此不能用谷歌搜索它。(最坏的情况显然是O(N^3),对于2个数的解,它实际上是O(N^2)) 在现实世界中,它并不能解决任何问题,只是让我感到厌烦 有什么想法吗?听起来像是一个家庭作业问题 如果您可以找到两个和为N的值,但您希望将搜索

给定一个整数数组,找出其中任意3个和任意给定的T之和

我在一些在线帖子上看到了这一点,声称它有一个O(NlogN)解决方案

对于2个数字,我知道哈希表可以帮助O(N),但对于3个数字,我找不到一个

我也觉得这个问题听上去对一些棘手的问题很熟悉,但我记不起它的名字,因此不能用谷歌搜索它。(最坏的情况显然是O(N^3),对于2个数的解,它实际上是O(N^2))

在现实世界中,它并不能解决任何问题,只是让我感到厌烦


有什么想法吗?

听起来像是一个家庭作业问题


如果您可以找到两个和为N的值,但您希望将搜索扩展到三个值,那么对于集合中的每个值M,您不能查找两个和为(N-M)的值吗?如果你能在O(logn)时间内找到两个和特定值之和的值,那么这就是O(logn)。

我认为你的问题相当于

我认为这就是问题所在

如果是这样,它是NP完全的


编辑:没关系,它是3sum,正如另一个答案中所述。

2SUM问题可以在O(nlgn)时间内解决

首先对最多执行O(nlgn)操作的数组进行排序。现在,在第i次迭代中,我们选择元素
a[i]
,并在数组的剩余部分(即从
i+1
n-1
)中找到元素
-a[i]
,该搜索可以在二进制搜索中进行,该搜索最多需要lgn时间。因此,总的来说,它需要O(nlgn)操作


但3SUM问题不能在O(nlgn)时间内解决。我们可以把它简化为O(n^2)

对于三和问题,你找不到比O(n^2)更好的解。您可以参考直接从

排序;
对于i=0到n-3 do
a=S[i];
开始=i+1;
end=n-1;
而(开始<结束)做什么
b=S[开始];
c=S[结束];
如果(a+b+c==0),那么
输出a、b、c;
//继续搜索所有总和为零的三元组组合。
开始=开始+1
结束=结束-1
否则,如果(a+b+c>0),则
结束=结束-1;
其他的
开始=开始+1;
结束
结束
结束

右边还有许多类似的帖子。这类似于子集和问题,它是NP完全的。但将子集长度限制为3,可能会找到一个快速的解决方案。一个与此类似的困难(NP完全)问题称为。当然,这里的约束条件是只选取3个整数,最坏的情况是O(n^3),所以它并不完全相同。给出了该问题的一些O(n^2)解。在n个数中选择3个数的方法不到n^3,因此它很难是NP完全的。平凡的蛮力算法是O(n^3)。是的。子集问题是NP问题,但这不是子集问题。子集问题没有指定要加多少个数字,而这个问题将其限制为正好3。如何在log(N)时间内找到两个和为特定值的数字?好问题,我不知道。我没有说这是可能的,只是你需要能够这样做,以便以我所描述的特定方式解决问题。不确定那页上以前是什么,但现在不相关了。这就是为什么你要引用一些东西。对于两个问题,如果我们使用哈希表,它可以减少到O(N)。
    sort(S);

    for i=0 to n-3 do

        a = S[i];
        start = i+1;

        end = n-1;

        while (start < end) do

           b = S[start];
           c = S[end];
           if (a+b+c == 0) then
              output a, b, c;
              // Continue search for all triplet combinations summing to zero.
               start = start + 1
               end = end - 1

           else if (a+b+c > 0) then
              end = end - 1;
           else
              start = start + 1;
           end
        end
     end