4.1 単純線形探索


配列は,要素が順に並んでいますので,
目的とするキー値の要素に出会うまで,
配列添え字をカウントアップすれば
よいことになります。

以下は,キー値3を探索する場合の
添え字のカウントアップの状態を示します。


          

しかし,探索しようとするキーが配列に入っているとは限りませんので,
添え字の最大値を監視しておき,添え字の最大値を超えたら,
探索失敗として終了させる必要があります。

たとえば,キー値7を探索しようとして,
添え字をカウントアップすると,以下のように最大値を超えますので,
探索失敗とします。

           

この処理をプログラムで表現すると次のようになります。

  private int 探索(int V)
   {
     int R = -1;
     for(int i=0; i < myArray.Length; i++)
        if(V == myArray[i]) { R = i; break; }
     return R;
   }

ここで,条件の判定が,For文での添え字の判定,
要素の値判定の2箇所にあることに注意してください。

このことをはっきりさせるには,次のように,
for文をwhile文に展開させるとよいでしょう。

     int i = 0;
     while( i < myArray.Length)
     {
       if(V == myArray[i]) { R = i; break; }
       i++;
     }

したがって,探索失敗のときの判定回数は,
N = myArray.Lengthとして,

     2×N+1

となります。

先頭で成功するときは,先頭の判定だけですから,
2回だけの判定となります。

今,配列に含まれているN個のデータを探索しようとすると,
探索回数は,

  2+4+6+・・・+2N=2N(N+1)/2=N(N+1)

となります。

1個当たり,平均して

   平均判定回数=N(N+1)/N=N+1

となりますが,要素数Nが大きくなると,
ほぼNに比例するものと考えても構いません。   


[確認用プログラム例]

private int[] myArray= new int[]{7,3,4,5,1,9,8,6};

private void Form1_Load(object sender, System.EventArgs e)
{
  listBox1.Items.Clear();
  for(int I = 0;I < myArray.Length; i++)
        listBox1.Items.Add(myArray[i].ToString());
}
private int 探索(int V)
{
  int R = -1;
  for(int i=0; i< myArray.Length; i++)
      if(V == myArray[i]) { R = i; break; } return R;
}
private void button1_Click(object sender, System.EventArgs e)
{
  int R = 探索(int.Parse(textBox1.Text));
  listBox1.SelectedIndex = R;
  if(R < 0) MessageBox.Show ("探索できませんでした");
}


i
1. 基本的なアルゴリズム

2. 基本的なデータ構造

3. 操作を伴うデータ構造

4. 探索

5. 再帰的アルゴリズム

6. ソート

7. 集合

8. 文字列処理

9. 色々なアルゴリズム


上のタイトルをクリックします