番兵とは、サーチの際にダミーデータを使用することにより、処理を簡潔化する手法の一つである。
配列の内容を調べて、特定の値が存在するか否か、存在するとしたらどこにあるかを調べる場合がある。このような処理を一般に「サーチ」といい、端から順に調べていくという一番単純な方法を「リニアサーチ」と言う。
リニアサーチのアルゴリズムは、VBで書くと以下のようになる。
' a() サーチ対象の配列 ' n 有効なデータ数 ' v サーチする値 ' 戻り値:見つかった場合 ・・・配列のインデックス ' 見つからなかった場合・・・-1 Function search (a() As Integer, n As Integer, v As Integer) As Integer Dim i As Integer For i = 1 To n If a(i) = v Then ' 見つかった場合の処理 search = i Exit Function End If Next i search = -1 ' 見つからなかった場合の処理 End Function
このプログラムで悪いわけではないが、ループの脱出条件が二種類あるのが気に入らない(下記)。
番兵とは、ダミーデータの使用により、これら二つの条件を統合するものである。具体的には、最終要素の隣(データは入っていない)に、探すべき値を予め入れておく。これにより、値は「必ず見つかる」ことになり、上記 2.の条件を考えなくてもよいことになる。 具体的なプログラミング例は以下の如し。
Function search (a() As Integer, n As Integer, v As Integer) As Integer Dim i As Integer a(n + 1) = v ' 番兵をセットする i = 1 Do While a(i) <> v i = i + 1 Loop If i > n Then ’ 番兵にあたった場合 search = -1 ’ データは存在しなかったことになる Else search = i ’ データは存在している End If End Function
これにより、ループをすっきりと記述できる。これが番兵の効果である。 一般にループを高速化するテクニックとして、ループの外でできるだけ準備をしておき、ループ内の処理を極力単純化すべきである。番兵は、この一番単純かつ有名な例と言える。
![]() |
目次 |