ITサポーターTsuchida

VBA Advance8

第8章 バイナリサーチ

リニアサーチはデータ件数が増えるにしたがって遅くなりますが、バイナリサーチはデータ量が増えても遅くはなりません。大量データを検索するときに使用します。

バイナリサーチを行う場合は、検索する表のデータが昇順に並んでいる必要があります。そのため正しい結果を返すために、バイナリサーチの前に表を並び替えます。表が昇順に並んでいることで、順番の中央を比較して大小判断をしながら検索値を見つけます。

この方法で検索をすると、10000件のデータなら平均で13件目で見つかります。見つからない場合でも14件探すだけです。100000件になっても平均で16件目で、最大17件の比較で済みます。

ちなみにVlookup関数の引数がtrueはバイナリサーチになります。Vlookup関数の引数がtrueはデータ量が多くなっても遅くなりません。

バイナリサーチのアルゴリズム

同じブックにあるSheet2のシートの表のA列に該当するC列を取得する、リニアサーチで求める方法(検索値はsDataとする)

Dim ws As Worksheet

Dim imin As Long

Dim imax As Long

Dim icenter As Long

Dim result As Variant

Set ws = ThisWorkbook.Sheets("Sheet2")

'並び替えの処理

ws.Range("A1").CurrentRegion _

.Sort Key1:=Range("A1"), order1:=xlAscending, Header:=xlYes

ws.Sort.SortFields.Clear

result = ""

imin = 2

imax = ws.Cells(Rows.Count, 1).End(xlup).Row

Do While imin <= imax

icenter = (imin + imax) / 2

If sData = ws.Cells(icenter, 1) then

result = ws.Cells(icenter, 3)

Exit Do

ElseIf sData < ws.Cells(icenter, 1) then

imax = icenter - 1

Else

imin = icenter + 1

End If

Loop

icenterが中央値を表す指標で中央値と検索値が同じだったら見つかったものとします。中央値よりも検索値が小さかったらimaxにicenterの指標から1引いたものをセットし、中央値よりも検索値が大きかったらiminにicenterの指標から1足したものをセットします。

このようにすると、対象範囲が徐々に狭まるため、高速に見つけることができます。