2016-11-10 4 views
2

AとBの2つの並べ替えられたリストがあるとします。2つのソート済みリストの交差のための最も速いアルゴリズムは何ですか?

AとBのエントリ数は異なる場合があります。 (彼らは非常に小さくても巨大であってもよく、お互いに似ていてもかなり異なっていてもよい)。

この機能のための最も速いアルゴリズムとして知られているものは何ですか?

私にアイデアやリファレンスを与えることはできますか?

+1

リストAのバイナリ検索をリストBのすべての要素に適用すると、O(nlog(n))で実行できます。リストのサイズが大きく異なる場合は、大きなリストを検索することをお勧めします。 – Shubham

+0

あなたは悪いアプローチをしているようです。なぜあなたは不要なステップをとらない自分のアルゴリズムを開発するのではなく、最も速く知られているアルゴリズムについて尋ねていますか? – xenteros

+0

@syko私は – xenteros

答えて

3

Am要素を有し、Bm ≥ nn要素を有していると仮定する。空の交差点を検証するために、我々は基本的にソートマージを実行する必要があるため情報は、理論的に、私たちができる最善のは、

(m + n)! 
lg -------- = n lg (m/n) + O(n) 
    m! n! 

の比較です。この境界の定数の範囲内では、Bを反復し、Bの最新の要素がソートされた順序を維持するために挿入される位置を示すAに「カーソル」を保持することによって達成できます。我々はx_1 + x_2 + ... + x_n = m + nmのいくつかの整数分割である

lg x_1 + lg x_2 + ... + lg x_n, 

程度であるトータルコストのために、カーソルを進めるためexponential searchを使用します。この合計は、lgの凹みによってO(n lg (m/n))である。

0

が、これは最速のオプションであれば、私は知りませんが、ここでnmはあなたのリストのサイズですO(n+m)で実行する1だ整数

for(int i = A.size() - 1; i > -1; --i){ 
    Integer currentInteger = A.get(i); 
    if(!B.remove(currentInteger)) 
     A.remove(currentInteger); 
} 
2

と2つのリストAとBがあると仮定します。そのうちの一つは、次のように空になるまで、両方のリストの上に

  • ループ:1、リスト上の一つ
  • アドバンス。
  • 他のリストの現在の値以上の値が見つかるまで、他のリストに進む。
  • 等しい場合、要素は交差点に属し、別のリストに追加することができます
  • 他の要素より大きい場合は、この値以上の値が見つかるまで他の要素に進みます
  • 言ったように、リストの1まで、これを繰り返しては空です。この機能のための最速のアルゴリズムであることが知られているどのよう
+3

これは当然であり、*リンクされたリスト(リニアスキャンがやむを得ない場合)に最適かもしれません。一方、ランダムアクセスが可能な場合(実際には配列であるPythonリストのように)、バイナリ検索を使用して次の共通要素を見つけるものは、リストが大きく、交差が小さい場合には、はるかに優れているかもしれません。リストについてもう少し詳しく知ることなしに、最良のアプローチが何であるかを言うのは難しいようです。 –

+0

@JohnColemanそれは正しいです。私の答えは、OPがO(1)ではアクセス可能な要素が不可能になるように、内部で配列によってサポートされていないリンクリスト(JavaのArrayListやArrays/Lists他の多くのプログラミング言語)を話していたという前提に基づいています。 – Keiwan

0

利用二つのリストがにソートされている場合に最良であるmerge sort技術。組み合わせソートリストを取得するには、O(n+m)が必要です。

2つのリストをトラバースせずに並べ替えることはできません。あなたが達成できる最高のものはO(n+m)です。行うにはどのように

:、両方のリストの先頭から始めて比較し、ピックアップ低い値を、インクリメンタルドナーリスト内の次に移動し、一方または両方のリストが空になるまで繰り返し。 1つのリストが空でない場合は、結果のリストに追加するだけです。

+0

問題の前提は、リストが既にソートされていることです。 1つのリストが100個の奇数で構成され、もう1個のリストが1,000,000,000個の偶数で構成されている場合、その交差が空であることを決定するために1,000,000,100ステップを取るべきではないので、O(m + n) –

+0

Quesは、リンクされたリストのランダムアクセスをどのように使用するかを示しています。また、リストの番号やパターンのタイプをあらかじめ知っていることはめったにありません。だから、そのリストには適用できないシナリオではないでしょうか? –

+0

OPは、リンクされたリストとリンクされていないリストについて明示的ではありませんでした。これらがランダムアクセスリストであり、そのサイズを知っているなら、 'm + n '、' m * log(n、2) '、' n * log (m、2) 'が最小である。 1,000,000,100の底2の対数の100倍である3000は、1,000,000,100より小さい桁のオーダーであるため、単純なマージアプローチは、大きなリストの100個の要素の連続バイナリ検索ほど良くはありません。正しく実装されている場合、非常に最初の検索は交差点が空であるという最終的な答えで停止します。 –

関連する問題