のすべての可能な値を計算しa_w + a_x
、それらをハッシュ テーブルに挿入します。(a_w + a_x, w) と (a_w + a_x, x) を 2 番目のハッシュ テーブルに挿入します。
最初のハッシュ テーブルに値を挿入する前に、値が既にテーブルにあるかどうかを確認します。その場合は、2 番目のテーブルを確認してください。(a_w + a_x, w) または (a_w + a_x, x) のいずれかが存在する場合は、何も挿入しないでください (要素が重複しています)。これらのペアのどちらも 2 番目のテーブルにない場合、肯定的な答えが得られます。
すべての (w, x) ペアを処理した後、肯定的な答えが得られない場合、これはそのようなペアごとに異なるインデックスがないことを意味します。
時間計算量は O(n 2 ) です。スペース要件も O(n 2 ) です。
O(n) 空間で同じことを行うことは可能ですが、O(n 2 * log(n)) 時間は、この回答からわずかに変更されたアルゴリズムを使用して実行できます:固定サブセット サイズの合計サブセット:
- リストを並べ替えます。
a_w + a_x
キーおよび値として含まれる要素の優先キューを使用w, x
します。このキューにn-1
要素を事前に入力します。ここで、x = 0 および w = 1 .. n-1 です。
(sum, w, x)
このキューから最小限の要素を繰り返し取り出し、要素をキューに入れ(a_w + a_x_plus_1, w, x+1)
ます (ただし、x >= w の場合は要素を入れません)。キューから削除された 2 つの連続する要素の合計が同じになったら停止します。
- 重複を処理するために、合計が等しい 2 つの連続する要素の w、x を比較することができます。しかし、krjampani の前処理のアイデアを使用する方が簡単です。ソートされたリストに 2 組の重複が含まれているか、1 つの要素が 4 回重複している場合、成功です。それ以外の場合、重複する値は 1 つだけです。そのインスタンスを 1 つだけリストに残し、その 2 倍の値をインデックスの「特別な」ペア (2a, -1, -1) と共に優先キューに追加します。