オーロラさんの勉強帳

IT企業勤務。データベース、Excel、Excel VBA、ネットワーク、LinuxなどIT関連のことを主に書いていきます。少しでもお役に立てたら幸いです。

【探索アルゴリズム】二分探索法とは。Excel VBAで二分探索法を試してみる (基本情報技術者・応用情報技術者試験)


<目次>

記事の目的

本記事の目的は以下の通りです。

  • 代表的な探索アルゴリズムの一つである「二分探索法」を、Excel VBAでコードを書いて、プログラムを動かすことで理解を深めること。
  • 基本情報技術者試験応用情報技術者試験の試験対策として、「二分探索法」の学習をすること。

二分探索法とは

二分探索法とは、昇順もしくは降順に並んでいる配列に対して、探索範囲を半分に限定しながら目的のデータを探索するアルゴリズムです。
代表的な探索アルゴリズムの一つで、英語では「binary search」(バイナリーサーチ)といいます。

<二分探索法の動き>
目的のデータと配列の中央のデータを比較します。
目的のデータと配列の中央のデータが一致しない場合は、目的のデータと中央のデータの大小関係により、探索範囲を前半、もしくは後半の半分に限定します。(探索範囲を半分に限定するときには、中央のデータを省きます)
この操作を、データが一致するもしくは、探索する範囲がなくなるまで繰り返します。


二分探索法の例

以下の画像の例では、昇順に整列済みの配列Aに対して、二分探索法で「14」を探しています。

二分探索の参考例

<1回目>では、探索範囲の中央のA(6)と14を比較します。A(6)が探索データより小さいため、A(0)~A(6)の範囲には探索データがないことが分かります。

<2回目>では、lowを「<1回目>のmiddle+1」に切り上げて範囲を限定しています。探索範囲の中央のA(10)と探索データを比較しています。
A(10)が探索データより大きいため、A(10)~A(14)に探索データがないことが分かります。

<3回目>では、highを「<2回目のmiddle-1>」に切り下げて範囲を限定しています。探索範囲のA(8)と探索データを比較し、データが一致しているため、探索データ「14」が配列に存在することが分かりました。


二分索法の探索回数、計算量

二分探索法にて、N個のデータから特定のデータを探索する場合の探索回数、計算量は以下の通りです。

最小回数 1
最大回数 (log2N)+1
平均回数 log2N
計算量 O(logN)


二分探索法をVBAで書いてみる

以下のように1行目に昇順に並んだ数字が入力されてるデータから、特定の数字を二分探索するコードを考えてみましょう。


書き方はいろいろありますが、以下のように書きました。
InputBoxで入力された数字を二分探索し、データがあった場合は何番目に存在したかをメッセージで返すコードとなっています。
※1行目の数字データは、何個でも対応可能です。
※データは昇順に並んでいる必要があります。

Option Explicit

Sub binarySearch()

    '変数の宣言
    Dim target As Long
    Dim low As Long, high As Long, middle As Long
    Dim result As String

    '探索する数字を入力
    target = InputBox("対象")
    '結果の初期値を入力
    result = target & "は存在しません"
    
    'low、high、middleに列番号(インデックス番号)を格納
    low = 1
    high = Cells(1, Columns.Count).End(xlToLeft).Column
    middle = (low + high) / 2
    
    'low > middleになるまで、繰り返す。
    Do While low <= high
        '列番号middleの値で分岐する
        Select Case Cells(1, middle)
            'middle  = target なら、resultに結果を格納して、繰り返しを抜ける
            Case target
                result = target & "は" & middle & "番目に存在します。"
                 Exit Do
            'middle > target ならhighを切り下げる(探索範囲を前半に絞る)
            Case Is > target
                high = middle - 1
            'middle < target ならlowを切り上げる(探索範囲を後半に絞る)
            Case Is < target
                low = middle + 1
        End Select
        
        '切り下げたhighもしくは切り上げたlowをもとにmiddleを算出
        middle = (low + high) / 2
    Loop
    
    '結果を表示させる
    MsgBox result

End Sub


以上、お読みいただきありがとうございました。

【探索アルゴリズム】線形探索法とは。Excel VBAで線形探索法を試してみる (基本情報技術者・応用情報技術者試験)

<目次>

記事の目的

本記事の目的は以下の通りです。

  • 代表的な探索アルゴリズムの一つである「線形探索法」を、Excel VBAでコードを書いて、プログラムを動かすことで理解を深めること。
  • 基本情報技術者試験応用情報技術者試験の試験対策として、「線形探索法」の学習をすること。

線形探索法とは

線形探索法とは、配列の先頭の要素から順番に目的の要素を探索していくアルゴリズムです。
代表的な探索アルゴリズムの一つで、英語では「linear search」(リニアサーチ)といいます。

線形探索法


以下の画像では、配列Aから4を線形探索しています。

線形探索の参考例

線形探索法の探索回数、計算量

線形探索法にて、N個のデータから特定のデータを探索する場合の探索回数、計算量は、以下表のとおりです。

最小回数 1
最大回数 N
平均回数 (1+N)÷2
計算量 O(N)

探索回数は、一番最初に探索するデータがある場合が最小の1回、N番目に探索するデータがある場合が最大のN回です。
そのため、線形探索法の平均探索回数は、( 1 + N ) ÷ 2です。
〈(最小探索回数1回+最大探索回数N回) ÷ 2回〉


線形探索法をVBAで書いてみる

以下のように[A1]~[E1]の5つの数字から、特定の数字を線形探索するコードを考えてみましょう。

探索するデータ


書き方はいろいろありますが、以下のように書きました。
InputBoxで入力された数字を線形探索し、データがあった場合は何番目にあったかをメッセージで返すコードとなっています。

Option Explicit
'配列のインデックス番号を1からとする
Option Base 1

Sub linearSearch()

    '変数の宣言
    Dim target As Long
    Dim list(5) As Long
    Dim i As Long
    Dim result As String


    '探索する数字を入力
    target = InputBox("対象")
    'データがなかった場合のメッセージをresultに格納
    result = target & "はありませんでした"

    '配列にデータを格納
    For i = 1 To 5
        list(i) = Cells(1, i)
    Next i
    
    '線形探索
    For i = 1 To 5
        If list(i) = target Then
            'データが見つかった場合、resultを上書きし、For文を抜ける
            result = target & "は" & i & "番目にありました"
            Exit For
        End If
    Next i
    
    '結果を表示する
    MsgBox result
    
End Sub


以上、お読みいただきありがとうございました。

探索アルゴリズムの「二分探索法」については、以下の記事で紹介しています。
auroralights.jp

複数のシステム(直列システム・並列システム)の稼働率の計算方法を分かりやすく解説 【基本情報技術者・応用情報技術者試験】

基本情報技術者試験ITパスポートの試験範囲である複数のシステム(直列システム・並列システム)の稼働率の計算方法を紹介します。
並列システムの稼働率は、式を丸暗記するのではなく、考え方を理解して自分で式を導き出せるようにしておきましょう。

直列システムの稼働率の計算方法

システムAとシステムBが直列で接続されている場合、システム全体が稼働するのは、システムA、システムBの両方が稼働しているときです。(一方のシステムが故障するとシステム全体が停止します)

システムAとシステムBが直列で接続されている場合、システム全体の稼働率は稼働率A×稼働率Bで求めます。(稼働率AはシステムAの稼働率、稼働率BはシステムBの稼働率です)

稼働率 = 稼働率A × 稼働率B

直列システムの稼働率


以下のように接続するシステムが増えた場合も、各システムの稼働率を乗算することで、システム全体の稼働率を求めることができます。

稼働率 = 稼働率A × 稼働率B × 稼働率C

直列システムの稼働率

並列システムの稼働率の計算方法

システムAとシステムBが並列に接続されている場合、システム全体が稼働するのはシステムAもしくはシステムBの少なくとも一方が稼働しているときです。
(システム全体が停止するのは、システムA、システムBの両方が故障しているときです)

システムAとシステムBが並列に接続されているシステム全体の稼働率は、1-(1-稼働率A)×(1-稼働率B)で求めます。(稼働率AはシステムAの稼働率、稼働率BはシステムBの稼働率です)

稼働率 = 1 - (1 - 稼働率A) × (1 - 稼働率B)

並列システムの稼働率

以下のように接続するシステムが増えた場合も、各システムの(1 - 稼働率)を乗算し、最終的に1から減算します。

稼働率 = 1 - (1 - 稼働率A) × (1 - 稼働率B) × (1 - 稼働率C)

並列システムの稼働率

並列システムの稼働率の考え方

システムAとシステムBが並列で接続されている場合、システム全体の稼働率を求めるには、まず両システムが故障している故障率を求めます。
そして、1からその故障率を減算することで、並列システムの稼働率を求めることができます。

以下の式を詳しく見ていきましょう。

稼働率 = 1 - (1 - 稼働率A) × (1 - 稼働率B)

(1-稼働率A)は、システムAの故障している確率を求めています。
(1-稼働率B)は、システムBの故障している確率を求めいてます。
(1-稼働率A)×(1-稼働率B)は、システムA、Bの両方が故障している確率を求めています。

並列システムの稼働率の計算


1-(1-稼働率A)×(1-稼働率B)は、「システムA、Bの両方が故障している」以外、すなわちシステムA、Bの少なくともどちらか一方は稼働している確率(システム全体の稼働率)を求めています。

並列システムの稼働率の計算

稼働率のポイント

- 直列システムの稼働率 = 稼働率A × 稼働率B
- 並列システムの稼働率 = 1 - (1 - 稼働率A) × (1 - 稼働率B)
- 故障率 = 1 - 稼働率


以上、お読みいただきありがとうございました。

auroralights.jp