![]() |
||||
単純線形探索法では, 添え字が最大値を超えるかどうかを 監視する必要がありましたが, 配列の最後に,探索すべきキーを 入れることによって, 監視のための判定をなくす方法です。 ![]() しかし,探索しようとするキーが配列に入っていないときでも 例えば,7を探索しようとすると,最後で判定がOKになります。 ![]() ただし,番兵のところに探索しようとするキーを 入れていたわけですから, それ以前では判定が成功しなかったことが分かります。 すなわち,番兵のところでOKになった場合, 探索失敗とみなします。 この処理をプログラムで表現すると次のようになります。 ただし,配列はひとつだけ余分に大きくとります。 private int 探索(int V) //番兵法 { myArray[myArray.Length-1]=V; int i=0; while (V != myArray[i]) i++; return i; } 以下の線形探索と比較しみましょう。 線形探索では,1回の繰返しにおける判定が 2個あります。 private int 探索(int V) { int R = -1; int i = 0; while( i < myArray.Length) { if(V == myArray[i]) { R = i; break; } i++; } return R; } 番兵法では,繰返しにおける判定が1個になっていますので, 線形探索より,若干,効率が良いことになります。 ただし,計算量がNに比例しているのは, 線形探索と同じです。 [確認用プログラム例] フォームは線形探索と同じ。
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 上のタイトルをクリックします |
||||