アルゴリズムを開発して2和問題を解決するには?


8

整数の並べ替えられた配列があるとすると、合計がペアの数を見つけたいと思います。例えば、所与の{ - 3 - 2 0 2 3 4 }、ゼロに対合計の数である20{3,2,0,2,3,4}2

ましょ入力配列の要素の数です。バイナリ検索を使用して配列の要素の追加の逆を見つける場合、順序はO log N です。セット内のすべての要素をトラバースする場合、順序はO N log N です。NO(logN)O(NlogN)

次数アルゴリズムを見つける方法は?O(N)


2
-SUMの問題は通常、1つの一連の見つけようとわずかに異なる問題、意味k個の入力配列からの要素A彼らがゼロに合計するようにします。計算の特定のモデルでは、のための線形時間アルゴリズム得ることは不可能であるK = 2、または任意の偶数のためにKをこの質問を参照してください。kkAk=2k
Juho 2013

回答:


12

してみましょうソートされた入力配列すること。Aの要素を通過する2つのポインターlrを保持します。ポインターlは、Aの「左側の部分」、つまり負の整数を通過します。ポインターrは、「右側の部分」、正の整数に対して同じことを行います。以下では、疑似コードソリューションの概要を説明し、簡単にするために0∉Aと仮定します。また、Aに正または負の整数しかない場合のチェックも省略されています。AlrAlAr0AA

COUNT-PAIRS(A[1..N]):
 l = index of the last negative integer in A
 r = index of the first positive integer in A
 count = 0;

 while(l >= 0 and r <= N)
   if(A[l] + A[r] == 0)
     ++count; ++right; --left; continue;

   if(A[r] > -1 * A[l]) 
     --left;
   else 
     ++right;

アルゴリズムが時間かかることは明らかです。O(N)


3
正確性のために、おそらく引数を追加する必要があります。
ラファエル

-1

私の理解では、最も簡単なアプローチは、ハッシュテーブルH = {a [0] = true、..、a [n-1] = true}を使用することです。このハッシュテーブルはO(n)時間で構築できます。ハッシュテーブルが作成されたら、A [0、..、n-1]を反復処理し、H [-1 * a [i]]が存在するかどうかを確認します。ある場合は、カウンターを1増やし、最終結果を返します。これは明らかにO(n)です。


3
式H = {a [0] = true、..、a [n-1] = true}およびA [0、..、n-1]は私には意味がありません。ハッシュ関数を使用する場合、配列をソートすることもできません。ただし、ハッシュ関数を使用するアルゴリズムは、ハッシュ関数のいくつかの擬似ランダムプロパティを使用します。最悪の場合、すべてのアイテムが同じハッシュ値にマッピングされ、アルゴリズムは二次式になります。OPの要件は何なのかわかりません。
miracle173

以下の私の実装を参照して、最悪の場合の二次式を教えてください。
サミー2017年

@ miracle173:これは表記の便宜にすぎません。ハッシュテーブルを一連のキーと値のペアとして表すことができます(これは、数学的に言えば、実際にはこれです)。メモリ内の実際の配置は、複雑さに関する理論的な詳細には不要です。また、ハッシュ関数は、十分なシードエントロピーを提供する衝突を回避するように設計されています。Juhoの答えは「ソートされたA」を前提としているため、私は答えました。これにより、暗黙的に複雑さO(n log(n))および* NOT O(n)になります。
Juspreet Sandhu 2017

@ manbearpig1 User Evilはすでに、あなたの質問に答えるべきコメントを投稿に追加しています。ハッシュテーブルルックアップの最悪のケースはO(n)であるため、アルゴリズム全体の最悪のケースはO(n ^ 2)です。
miracle173 2017年

@JuspreetSandhu Usere Evilさんが、ハッシュ関数の問題を説明するコメントを別の回答に追加しました。
miracle173 2017年

-1

Pythonセットの値を一定の時間で検索できることに注意してください。

def twoSum(data):
    count = 0
    nums = set()
    for num in data:
        if (num * -1) in nums:
            count += 1
        nums.add(num)
    return count

1
O(1)O(n)O(logn)O(n)nO(n2)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.