2

プロジェクトでは、バイナリ検索を実装する必要があります。このバイナリ検索では、重複が許可されます。ターゲットに一致するすべてのインデックス値を取得する必要があります。重複が途中にあることが判明した場合、私はこのようにすることを考えました:

Target = G 次の並べ替えられた配列があるとします。

G D D E D E G D D G D G D G D G G G G G G G G G G G G G G G G G G G G G G G A G G G G G G G G G G G G G G G G G G C絶対絶対G.GabたG.

両方のターゲット マッチがあり、すべてのターゲット マッチが必要なので、すべてを取得する良い方法は mid + 1 が同じ値である場合にチェックすることだと思いました。そうである場合は、そうでなくなるまで右中央に移動し続けます。したがって、次のようになります。

B, D, E, F, G, G, G, G, G, G (MID), Q, RS, S, Z

次に、0 から mid までカウントして、ターゲットの一致をカウントアップし、それらのインデックスを配列に格納して返します。

ミッドが一致し、重複が初めてミッドにあり、アレイの両側にある場合、それを行うことを考えていました。


では、最初に一致しなかった場合はどうなるでしょうか。例えば:

B, D, E, F, G, G, J, K, L, O, Q, R, S, S, Z

次に、通常どおり mid を取得し、first から mid-1 まで二分探索を呼び出します。

G D D D D D G D D D G D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D D G

G は F より大きいため、mid+1 から last まで二分探索を呼び出します。

G、G、J.

ミッドはマッチです。マッチなのでmid+1からlastまでforループで検索し、マッチ数をカウントアップしてマッチインデックスを配列に格納して返す。

これは、バイナリ検索がすべての重複を取得するための良い方法ですか? 私のアルゴリズムに問題があり、ヒントや提案があれば教えてください。私が見る唯一の問題は、すべての一致が私のターゲットである場合、基本的に配列全体を検索することになりますが、その場合でもすべての重複を取得する必要があるということです。

ありがとうございました

ところで、私のインストラクターは、ベクトル、ハッシュ、またはその他のものは使用できないと言いました。彼は、私たちが配列レベルにとどまり、それらの使用と操作に慣れることを望んでいます。

4

4 に答える 4

2

私は、配列に修正された二分探索アルゴリズムを使用するソリューションでこの質問に答えました。これは宿題なので、甘やかされたくない場合を除いてリンクをクリックしないでください。ただし、要点は、バイナリ検索ループの条件をいじることで、次の3つの動作のいずれかを実行できるようにすることです。

  1. 一致が見つかった瞬間に一致を返します(通常の動作、一致は同じ値の実行のどこにあってもかまいません)
  2. 左端の一致を返します
  3. 右端の一致を返します

次に、このバイナリ検索を2回実行して質問に回答します。1回目は左端の一致を検索し、もう1回は右端の一致を検索します(最初の実行が成功した場合のみ)。2つの結果の差、つまり一致インデックスは、検出された一致の総数より1少ない数です。

于 2010-03-14T12:02:10.387 に答える
2

stl のlower_bound関数のソース コードを参照してください。

手元にまたは学校の図書館に Programming Pearls のコピーがある場合は、本の最後にある第 4 章とその解決策を参照してください。

于 2010-03-13T06:41:11.430 に答える
2

一致するものを見つけるとすぐに、二分探索の優れた点から離れたいと思うのはなぜですか? 上半分でバイナリ検索を使用して、それ以上 G が得られなくなるまで絞り込んでから、下半分で同じことを行ってみませんか。そうすれば、最悪の場合、配列全体を検索していません。この方法で最小インデックスと最大インデックスを見つけ、それらとすべての中間インデックスを配列に格納します。

于 2010-03-13T05:49:34.427 に答える
0

要素 X を検索しているのではなく、Y < X である境界 Y,X と、X < Z である X,Z に対して対称的に検索していることに注意してください。要素間の境界で構成される配列。

于 2010-03-13T07:05:28.027 に答える