web-dev-qa-db-ja.com

二分探索が分割統治アルゴリズムであるのはなぜですか?

バイナリ検索は、試験で分割統治アルゴリズムかどうか尋ねられました。結果に達するまで、問題を小さなサブ問題に分割したので、私の答えは「はい」でした。

しかし、審査官はその中の征服部分はどこにあるのかと尋ねましたが、私は答えることができませんでした。彼らはまた、それが実際には分割統治アルゴリズムであることを認めませんでした。

しかし、私がWebにアクセスすると、どこにでもあると書かれているので、その理由と、その征服部分がどこにあるのかを知りたいのですが。

20
Kenci

Data Structures and Algorithm Analysis in Java, 2nd edtition, Mark Allen Weiss

D&Cアルゴリズムには2つの互いに素な再帰呼び出しが必要であると言います。つまり、QuickSortが好きです。再帰的に実装できたとしても、二分探索にはこれがないので、これが答えだと思います。

14
Kenci

分割統治ではないと思います。 http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm の最初の段落を参照してください。

問題を2つ以上のサブ問題に再帰的に分解し、それらを組み合わせて解決策を提供します。

二分探索では、ステップごとにデータを半分に減らすだけの問題が1つしかないため、結果の征服(マージ)フェーズは必要ありません。

9
pointer

分割統治戦略では:

1.問題はいくつかの部分に分かれています。

2.これらの各部分は、手元のアルゴリズムを適用することにより、個別に攻撃/解決されます(ほとんどの場合、この目的には再帰が使用されます)。

3.次に、各パーティション/分割のソリューションを組み合わせて/マージして、問題全体の最終的なソリューションに到達します(これは征服

例、クイックソート、マージソート。

基本的に、二分探索アルゴリズムは、各反復でその作業空間(サイズnの入力(順序付き)配列)を半分に分割するだけです。したがって、それは間違いなくdivide戦略を展開しており、その結果、時間計算量はO(lg n)まで減少します。したがって、これは「その一部を分割します。

お気づきのように、最終的な解決策は、最後に行われた比較、つまり、比較対象の要素が1つだけ残っている場合に得られます。二分探索は、ソリューションをマージまたは結合しません。

要するに、二分探索は問題(それが機能しなければならない)のサイズを半分に分割しますが、solutionを少しずつ分割するため、ソリューションをマージする必要はありません。

少し長すぎることは知っていますが、お役に立てば幸いです:)

また、次の場所からアイデアを得ることができます: https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/running-time-of-binary-search

また、この質問がずっと前に投稿されたことに気づきました。私の悪い!

4
Priyanka

分割部分はもちろん、セットを半分に分割します。

征服部分は、処理された部分のどの位置に検索された要素があるかを判断します。

2
Rafał Rawicki

どうやら、二分探索を分割統治アルゴリズムと考える人もいれば、そうでない人もいます。私はすぐにそれをD&Cアルゴリズムと呼ぶ3つの参照(すべて学界に関連しているようです)をグーグルで検索しました: http://www.cs.berkeley.edu/~vazirani/algorithms/chap2.pdfhttp://homepages.ius.edu/rwisman/C455/html/notes/Chapter2/DivConq.htmhttp://www.csc.liv.ac.uk/~ped/teachadmin/algor /d_and_c.html

D&Cアルゴリズムには、これら3つのフェーズの少なくとも最初の2つのフェーズが必要であるというのは一般的な合意だと思います。

  • 分割します。つまり、問題全体をサブ問題にどのように分割するかを決定します。
  • 征服する、つまり各サブ問題を個別に解決する。
  • [オプション]結合、つまり独立した計算の結果をマージします。

2番目のフェーズ(征服)では、同じ手法を再帰的に適用して、さらに小さなサブサブ問題などに分割することでサブ問題を解決する必要があります。ただし、実際には、小さなサイズの場合と同様に、再帰的アプローチを制限するために何らかのしきい値が使用されることがよくあります。問題は別のアプローチの方が速いかもしれません。たとえば、クイックソートの実装では、多くの場合、たとえばソートする配列部分のサイズが小さくなった場合のバブルソート。

3番目のフェーズはノーオペレーションである可能性があり、私の意見では、アルゴリズムをD&Cとして失格にすることはありません。一般的な例は、for-loopの再帰的分解であり、すべての反復は純粋に独立したデータ項目で機能します(つまり、フォームの縮小はありません)。一見役に立たないように見えるかもしれませんが、実際には非常に強力な方法です。ループを並行して実行し、CilkやIntelのTBBなどのフレームワークで利用します。

元の質問に戻ります。アルゴリズムを実装するコードについて考えてみましょう(私はC++を使用しています。これが使い慣れた言語でない場合は、申し訳ありません)。

_int search( int value, int* a, int begin, int end ) {
  // end is one past the last element, i.e. [begin, end) is a half-open interval.
  if (begin < end)
  {
    int m = (begin+end)/2;
    if (value==a[m])
      return m;
    else if (value<a[m])
      return search(value, a, begin, m);
    else
      return search(value, a, m+1, end);
  }
  else // begin>=end, i.e. no valid array to search
    return -1;
}
_

ここで、分割部分はint m = (begin+end)/2;であり、残りはすべて征服部分です。分岐の1つだけが取られている場合でも、アルゴリズムは再帰的なD&C形式で明示的に記述されています。ただし、ループ形式で記述することもできます。

_int search( int value, int* a, int size ) {
  int begin=0, end=size;
  while( begin<end ) {
    int m = (begin+end)/2;
    if (value==a[m])
      return m;
    else if (value<a[m])
      end = m;
    else
      begin = m+1;
  }
  return -1;
}
_

ループを使用してバイナリ検索を実装するのは非常に一般的な方法だと思います。再帰的な例と同じ変数名を意図的に使用したので、共通性がわかりやすくなりました。したがって、ここでも、中点の計算は除算部分であり、ループ本体の残りの部分は征服部分であると言えます。

しかしもちろん、審査官の考え方が異なると、それが教義と聖約であると納得させるのは難しいかもしれません。

更新:D&Cアルゴリズムの一般的なスケルトン実装を開発する場合、API適合性テストの1つとしてバイナリ検索を使用して、APIが十分に強力であるかどうかを簡潔に確認することを考えていました。もちろん、それは何も証明しません:)

2
Alexey Kukanov

@ Kenciの投稿 に加えて、DnCアルゴリズムにはいくつかの一般的/共通のプロパティがあります。彼ら:

  1. split元の問題インスタンスをそれ自体の小さなサブインスタンスのセットに分割します。
  2. 独立して解決各サブインスタンス;
  3. Combine小さい/独立したサブインスタンスソリューションを使用して、大きい/元のインスタンスの単一のソリューションを構築します

バイナリ検索の問題は、ステップ1のように、notが実際に解決する独立したサブインスタンスのセットを生成することです。単純化元の問題を永久に破棄関心のないセクションでのみ。つまり、削減するだけです。問題の大きさ、そしてそれはこれまでのところです。

DnCアルゴリズムは、元の問題の小さなサブインスタンスを互いに独立して識別/解決するだけでなく、その部分的に独立したソリューションのセットを使用して、大きな問題インスタンス全体の単一のソリューションを「構築」することになっています。 。

Fundamentals of Algorithmics、G。Brassard、P。Bratleyは次のように述べています(太字で強調、元のイタリック体):

これはおそらく分割統治法の最も単純なアプリケーションであり、実際には非常に単純なので、厳密に言えば、これは分割統治法ではなくsimpleificationのアプリケーションです。 conquer:十分に大きいインスタンスの解は、単一の小さいインスタンス(この場合は半分のサイズ)の解に縮小されます。

セクション7.3二分探索 on p.226

2
code_dredd

分割統治アルゴリズムは、次の3つのステップに基づいています。

  1. 分割する
  2. 征服する
  3. コンバイン

二分探索問題は、ソートされた配列A [n]でxを見つけることとして定義できます。この情報によると:

  1. 除算:xを中央と比較
  2. 征服:1つのサブ配列で再帰します。 (この配列でxを見つける)
  3. 組み合わせる:必要ありません。
1
casi

二分探索は、征服のステップが明示的ではないため、分割統治法で説明するのは難しいです。アルゴリズムの結果は、干し草の山の針のインデックスであり、純粋なD&C実装は、最小の干し草の山の針のインデックスを返します(0 1要素リスト内)そして、分割ステップで分割されたより大きな干し草の山にオフセットを再帰的に追加します。

説明する擬似コード:

function binary_search has arguments needle and haystack and returns index
    if haystack has size 1
       return 0
    else 
        divide haystack into upper and lower half
        if needle is smaller than smallest element of upper half
            return 0 + binary_search needle, lower half
        else
            return size of lower half + binary_search needle, upper half

追加 (0 +またはsize of lower half)は征服部分です。ほとんどの人は、引数としてより大きなリストにインデックスを提供することでそれをスキップします。そのため、すぐに利用できないことがよくあります。

1
thiton

適切な分割統治アルゴリズムでは、両方の部分を処理する必要があります。

したがって、多くの人はnotバイナリ検索を分割統治アルゴリズムと呼びますが、divide問題ですが、残りの半分は破棄されます。

しかし、おそらく、あなたの審査官はあなたがどのように主張しているかを見たかっただけです。 (良い)試験は事実ではなく、チャレンジが元の資料を超えたときにどのように反応するかについてです。

したがって、私見の正しい答えは次のようになります。

まあ、技術的には、それは分割ステップのみで構成されていますが、元のタスクの半分だけを征服する必要があり、残りの半分はすでに簡単に実行されています。

ところで:QuickSelectと呼ばれるQuickSortの素晴らしいバリエーションがあります。これは実際にこの違いを利用して、平均O(n)中央値検索アルゴリズムを取得します。クイックソートに似ていますが、関心のある半分にしか下降しません。

1
Anony-Mousse

Merge SortおよびQuick Sortアルゴリズムは、分割統治手法(2つのサブ問題があるため)およびBinary Search分割統治法に分類されます(1つのサブ問題があるため)。

したがって、二分探索は実際には分割統治法ではなく、減少統治法を使用します。

出典: https://www.geeksforgeeks.org/decrease-and-conquer/

0
ricardoramos

減少と征服だと思います。

これがウィキペディアからの引用です。

「名前の減少と征服は、単一のサブ問題クラスの代わりに提案されました」

http://en.wikipedia.org/wiki/Divide_and_conquer_algorithms#Decrease_and_conquer

私の理解によると、 "征服"の部分は、バイナリ検索のターゲット要素を見つけたときに最後になります。 「減少」の部分は、検索スペースを削減しています。

0
arun8

二分探索および三分探索アルゴリズムは、減少および征服技術に基づいています。問題を分割しないので、実際には2(3値検索では3)で除算することによって問題を減らします。

マージソートとクイックソートのアルゴリズムは、分割統治法の例として挙げることができます。問題を2つのサブ問題に分割し、これらのサブ問題のアルゴリズムを再度使用して配列を並べ替えます。ただし、バイナリ検索では配列の半分を破棄します。これは、分割ではなく、配列のサイズを小さくすることを意味します。

0
sembozdemir

二分探索は分割統治アルゴリズムです。

1)分割統治アルゴリズムでは、小さなサブ問題を解決することで問題を解決しようとし(分割部分)、そのソリューションを使用して大きな問題のソリューションを構築します(征服)。

2)ここでの問題は、ソートされた配列で要素を見つけることです。同様のサブ問題を解くことでこれを解くことができます。 (ここでは、検索対象の要素が中央の要素よりも小さいか大きいという決定に基づいて、サブ問題を作成しています)。したがって、要素が確実に半分に存在できないことがわかったら、残りの半分で同様のサブ問題を解決します。

3)このように再帰します。

4)ここでの征服部分は、サブ問題によって返された値を再帰ツリーの一番上に返すだけです。

0
user1581106

非公式の定義は多かれ少なかれです:問題を小さな問題に分割します。次に、それらを解決し、それらをまとめます(征服します)。解決とは、実際、次に進む場所を決定することです(左、右、要素が見つかりました)。

ここに ウィキペディア からの引用:

「分割統治」という名前は、ソートされたリストでレコードを検索するための二分探索アルゴリズムなど、各問題を1つのサブ問題のみに減らすアルゴリズムにも適用されることがあります。

これは、[〜#〜] not [〜#〜][更新:これを読み間違えたフレーズ:)]分割統治の一部のみ。

更新:これ 記事は私にそれを明らかにしました。定義ではすべてのサブ問題を解決する必要があると書かれているので、私は混乱しました。しかし、検索を続ける必要がないことがわかっている場合は、サブ問題を解決しました。

0
duedl0r

コンピュータサイエンスの二分法とは、2つの異なる選択肢の中から、2つの正反対の選択肢から選択することを指します。二分法とは、全体を正確に2つの重複しない部分に分割することです。つまり、全体を2つの部分に分割する手順です。これは、全体(またはセット)を2つの部分(サブセット)に分割したものです。1。共同で網羅的:すべてがいずれかの部分に属している必要があります。2。相互に排他的:両方の部分に同時に属することはできません。

分割統治法は、問題を同じタイプの2つ以上のサブ問題に再帰的に分解することにより、これらが直接解決できるほど単純になるまで機能します。

したがって、二分探索は、各反復でチェックするアイテムの数を半分にし、その半分で「キー」アイテムを見つける可能性があるかどうか、またはキーがないことを判断できる場合は残りの半分に移動する可能性があるかどうかを判断します。アルゴリズムは本質的に二分法であるため、バイナリ検索では、キーが欠落していることが返される終了条件に達するまで、「キー」が一部に含まれている必要があると見なされます。

0
Vivek

いいえ、二分探索は分割統治法ではありません。はい、二分探索は減少して征服します。分割統治アルゴリズムの効率はO(n log(n))であるのに対し、分割統治アルゴリズムの効率はO(log(n))だと思います。違いは、データの分割の両方の部分を評価する必要があるかどうかです。

0
Alan Kurtzberg