計算複雑性理論では、3SUM問題は、与えられた集合が実数には合計がゼロになる3つの要素が含まれています。一般化されたバージョンでは、-SUM は、同じ質問をします要素は単に3ではなく、3SUMは簡単に解くことができます。時間、そしてマッチング計算の 特殊なモデルでは下限が知られています(Erickson 1999 )。
3SUMの決定論的アルゴリズムには、時間。2014年、アラン・グロンルンドとセス・ペティは、3SUMを解く決定論的アルゴリズムを提示し、元の3SUM予想を反駁した。時間。[ 1 ]さらに、GrønlundとPettieは、 3SUMの 4線形決定木の複雑さがこれらの境界はその後改善された。[ 2 ] [ 3 ] [ 4 ] 3SUMの現在最もよく知られているアルゴリズムは、時間。[ 4 ] ケイン、ロベット、モランは、3SUM の 6 線形決定木の複雑さが[ 5 ]後者の境界は(対数因子を除いて)タイトである。3SUMは解けないと依然として推測されている。予想時間。[ 6 ]
要素が範囲内の整数である場合3SUMは、入力セットを表現することで時間ビットベクトルとして、セットを計算するすべてのペアワイズ和を高速フーリエ変換を用いた離散畳み込みとして表し、最後にこのセットを[ 7 ]
入力配列が整数(ワード RAM)モデルの計算では、3SUM は次のように解くことができます。各数値を挿入して平均時間を計算するハッシュテーブルに変換し、次に各インデックスに対してそしてハッシュテーブルに整数が含まれているかどうかを確認します。
ハッシュ化が許可されていない比較ベースの計算モデルまたは実際の RAMでも、同じ時間で問題を解決できます。以下のアルゴリズムは、まず入力配列をソートし、次にすべての可能なペアをペアごとのバイナリサーチの速度低下を回避する慎重な順序でテストし、最悪の場合で を達成します。時間は以下のとおりです。[ 8 ]
sort(S); for i = 0 to n - 2 do a = S[i]; 開始 = i + 1; end = n - 1; while (start < end) do b = S[開始] c = S[end]; (a + b + c == 0)の場合、a、b、cを出力する。 // 合計がゼロになるすべての3つ組の組み合わせを引き続き検索します。 // 配列の値は異なるため、開始と終了の両方を同時に更新する必要があります。 開始 = 開始 + 1; end = end - 1; そうでなければ、 (a + b + c > 0)ならば end = end - 1; それ以外 開始 = 開始 + 1; 終わり終わり
以下の例は、このアルゴリズムを小さなソート済み配列に対して実行した結果を示しています。a の現在の値は赤色で、bとcの値はマゼンタ色で表示されています。
-25 -10 -7 -3 2 4 8 10 (a+b+c==-25) -25 -10 -7 -3 2 4 8 10 (a+b+c==-22) ... -25 -10 -7 -3 2 4 8 10 (a+b+c==-7) -25 -10 -7 -3 2 4 8 10 (a+b+c==-7) -25 -10 -7 -3 2 4 8 10 (a+b+c==-3) -25 -10 -7 -3 2 4 8 10 (a+b+c==2) -25 -10 -7 -3 2 4 8 10 (a+b+c==0)
アルゴリズムの正しさは次のように確認できます。解が a + b + c = 0 であるとします。ポインタは一方向にしか移動しないため、左端のポインタが a を指すまでアルゴリズムを実行します。残りのポインタのいずれかが b または c を指すまでアルゴリズムを実行します(どちらか早い方)。その後、最後のポインタが残りの項を指すまでアルゴリズムが実行され、肯定的な解が得られます。
合計が 0 になる数を探す代わりに、合計が任意の定数Cになる数を探すことも可能です。最も簡単な方法は、元のアルゴリズムを修正してハッシュテーブルから整数 を検索することです。 .
別の方法:
例えば、A=[1,2,3,4]で、C =4の3SUMを求めるように求められた場合、Aのすべての要素から4/3を引いて、通常の3SUMの方法で解きます。つまり、 .
単一の配列で 3 つの数を探す代わりに、3 つの異なる配列で探すことができます。つまり、3 つの配列 X、Y、Z が与えられたとき、次の条件を満たす3 つの数a ∈ X、b ∈ Y、c ∈ Zを見つけます。1つの配列のバリアントを3SUM × 1、3つの配列のバリアントを3SUM × 3と呼ぶ。
3SUM × 1のソルバーが与えられた場合、3SUM × 3 の問題は次のように解くことができます(すべての要素が整数であると仮定します)。
配列を変換した方法により、a ∈ X、b ∈ Y、c ∈ Zが保証されます。[ 9 ]
配列の任意の要素を探す代わりに、次のようになります。
畳み込み3sum問題(Conv3SUM)は、特定の位置にある要素を探します。[ 10 ]
3SUM のソルバーが与えられれば、Conv3SUM 問題は次のように解くことができます。[ 10 ]
正当性の証明:
Conv3SUM のソルバーが与えられれば、3SUM 問題は次のように解くことができます。[ 6 ] [ 10 ]
この削減処理ではハッシュ関数を使用します。まず近似として、線形ハッシュ関数、つまり次のような関数hがあると仮定します。
すべての要素が 0... N -1の範囲の整数であり、関数hが各要素をより小さいインデックス範囲 0... n -1 の要素にマッピングすると仮定します。新しい配列Tを作成し、 Sの各要素をT内のハッシュ値に送ります。つまり、 Sのすべてのx ( ):
まず、マッピングが一意であると仮定します(つまり、Tの各セルはSから単一の要素のみを受け入れます)。T に対して Conv3SUM を解きます。次に、
この理想的な解決策は機能しません。なぜなら、ハッシュ関数はSの複数の異なる要素をTの同じセルにマッピングする可能性があるからです。コツは配列を作成することです。Tの各セルからランダムに1 つの要素を選択し、Conv3SUM を実行します。 。解が見つかった場合は、 S上の 3SUM の正しい解です。解が見つからない場合は、別の乱数を生成します。そしてもう一度試してください。Tの各セルには最大でR個の要素があると仮定します。すると、解が見つかる確率 (解が存在する場合) は、ランダム選択によって各セルから正しい要素が選択される確率であり、それは次のようになります。Conv3SUMを実行することで多くの場合、解決策は高い確率で見つかるでしょう。
残念ながら、完全な線形ハッシュ関数は存在しないため、ほぼ線形なハッシュ関数、つまり次のような関数hを使用する必要があります。
これは、S の要素をTにコピーする際に、 Sの要素を複製する必要があることを意味します。つまり、すべての要素を両方とも(以前と同様に)そしてしたがって、各セルには 2 つのR要素が含まれるため、Conv3SUM を実行する必要があります。回。
問題を3SUM困難と呼ぶのは、その問題を2次時間未満で解くことが、 3SUMに対する2次時間未満アルゴリズムの存在を意味する場合である。3SUM困難性の概念は、GajentaanとOvermars(1995)によって導入された。彼らは、計算幾何学における多くの問題が3SUM困難であることを証明しており、その中には以下の問題が含まれる。(著者らは、これらの問題の多くは他の研究者によって貢献されたものであることを認めている。)
現在では、このカテゴリーに分類される他の問題が多数存在します。例としては、X + Y ソートの決定版があります。n個の要素を持つ数値の集合XとYが与えられたとき、 x ∈ X、y ∈ Yに対してn ² 個の異なるx + yが存在するか?[ 11 ]
{{cite arXiv}}: CS1 maint: 設定の上書き (リンク){{citation}}: CS1 maint: 非推奨のアーカイブサービス (リンク)。