kb/data/en.wikipedia.org/wiki/3SUM-1.md

7.0 KiB
Raw Blame History

title chunk source category tags date_saved instance
3SUM 2/3 https://en.wikipedia.org/wiki/3SUM reference science, encyclopedia 2026-05-05T11:01:54.553179+00:00 kb-cron

=== Three different arrays === Instead of searching for the 3 numbers in a single array, we can search for them in 3 different arrays. I.e., given three arrays X, Y and Z, find three numbers a∈X, b∈Y, c∈Z, such that

    a
    +
    b
    +
    c
    =
    0
  

{\displaystyle a+b+c=0}

. Call the 1-array variant 3SUM×1 and the 3-array variant 3SUM×3. Given a solver for 3SUM×1, the 3SUM×3 problem can be solved in the following way (assuming all elements are integers):

For every element in X, Y and Z, set:

    X
    [
    i
    ]
    ←
    X
    [
    i
    ]
    
    10
    +
    1
  

{\displaystyle X[i]\gets X[i]*10+1}

,

    Y
    [
    i
    ]
    ←
    Y
    [
    i
    ]
    
    10
    +
    2
  

{\displaystyle Y[i]\gets Y[i]*10+2}

,

    Z
    [
    i
    ]
    ←
    Z
    [
    i
    ]
    
    10
    
    3
  

{\displaystyle Z[i]\gets Z[i]*10-3}

. Let S be a concatenation of the arrays X, Y and Z. Use the 3SUM×1 oracle to find three elements

      a
      
    
    ∈
    S
    ,
     
    
      b
      
    
    ∈
    S
    ,
     
    
      c
      
    
    ∈
    S
  

{\displaystyle a'\in S,\ b'\in S,\ c'\in S}

such that

      a
      
    
    +
    
      b
      
    
    +
    
      c
      
    
    =
    0
  

{\displaystyle a'+b'+c'=0}

. Return

    a
    ←
    (
    
      a
      
    
    
    1
    )
    
      /
    
    10
    ,
     
    b
    ←
    (
    
      b
      
    
    
    2
    )
    
      /
    
    10
    ,
     
    c
    ←
    (
    
      c
      
    
    +
    3
    )
    
      /
    
    10
  

{\displaystyle a\gets (a'-1)/10,\ b\gets (b'-2)/10,\ c\gets (c'+3)/10}

. By the way we transformed the arrays, it is guaranteed that a∈X, b∈Y, c∈Z.

=== Convolution sum === Instead of looking for arbitrary elements of the array such that:

    S
    [
    k
    ]
    =
    S
    [
    i
    ]
    +
    S
    [
    j
    ]
  

{\displaystyle S[k]=S[i]+S[j]}

the convolution 3sum problem (Conv3SUM) looks for elements in specific locations:

    S
    [
    i
    +
    j
    ]
    =
    S
    [
    i
    ]
    +
    S
    [
    j
    ]
  

{\displaystyle S[i+j]=S[i]+S[j]}

==== Reduction from Conv3SUM to 3SUM ==== Given a solver for 3SUM, the Conv3SUM problem can be solved in the following way.

Define a new array T, such that for every index i:

    T
    [
    i
    ]
    =
    2
    n
    S
    [
    i
    ]
    +
    i
  

{\displaystyle T[i]=2nS[i]+i}

(where n is the number of elements in the array, and the indices run from 0 to n-1). Solve 3SUM on the array T. Correctness proof:

If in the original array there is a triple with

    S
    [
    i
    +
    j
    ]
    =
    S
    [
    i
    ]
    +
    S
    [
    j
    ]
  

{\displaystyle S[i+j]=S[i]+S[j]}

, then

    T
    [
    i
    +
    j
    ]
    =
    2
    n
    S
    [
    i
    +
    j
    ]
    +
    i
    +
    j
    =
    (
    2
    n
    S
    [
    i
    ]
    +
    i
    )
    +
    (
    2
    n
    S
    [
    j
    ]
    +
    j
    )
    =
    T
    [
    i
    ]
    +
    T
    [
    j
    ]
  

{\displaystyle T[i+j]=2nS[i+j]+i+j=(2nS[i]+i)+(2nS[j]+j)=T[i]+T[j]}

, so this solution will be found by 3SUM on T. Conversely, if in the new array there is a triple with

    T
    [
    k
    ]
    =
    T
    [
    i
    ]
    +
    T
    [
    j
    ]
  

{\displaystyle T[k]=T[i]+T[j]}

, then

    2
    n
    S
    [
    k
    ]
    +
    k
    =
    2
    n
    (
    S
    [
    i
    ]
    +
    S
    [
    j
    ]
    )
    +
    (
    i
    +
    j
    )
  

{\displaystyle 2nS[k]+k=2n(S[i]+S[j])+(i+j)}

. Because

    i
    +
    j
    <
    2
    n
  

{\displaystyle i+j<2n}

, necessarily

    S
    [
    k
    ]
    =
    S
    [
    i
    ]
    +
    S
    [
    j
    ]
  

{\displaystyle S[k]=S[i]+S[j]}

and

    k
    =
    i
    +
    j
  

{\displaystyle k=i+j}

, so this is a valid solution for Conv3SUM on S.

==== Reduction from 3SUM to Conv3SUM ==== Given a solver for Conv3SUM, the 3SUM problem can be solved in the following way. The reduction uses a hash function. As a first approximation, assume that we have a linear hash function, i.e. a function h such that:

    h
    (
    x
    +
    y
    )
    =
    h
    (
    x
    )
    +
    h
    (
    y
    )
  

{\displaystyle h(x+y)=h(x)+h(y)}

Suppose that all elements are integers in the range: 0...N1, and that the function h maps each element to an element in the smaller range of indices: 0...n1. Create a new array T and send each element of S to its hash value in T, i.e., for every x in S(

    ∀
    x
    ∈
    S
  

{\displaystyle \forall x\in S}

):

    T
    [
    h
    (
    x
    )
    ]
    =
    x
  

{\displaystyle T[h(x)]=x}

Initially, suppose that the mappings are unique (i.e. each cell in T accepts only a single element from S). Solve Conv3SUM on T. Now: