サイトマップ / C言語講座>出入り口>総目次>目次:ヒープ領域>バイナリサ−チ
[ヒープというデータ構造]←このソース→[分割コンパイル]
/* 今日はバイナリサーチ(2分検索)について学びます。ある配列があったとします。この配列は予め昇順にソートされているとします。例えば、下記の配列を見て下さい。
const char *base[ ] = { "atto ", "centi", "deca ", "deci ",
"exa ", "femto", "giga ", "hecto",
"kilo ", "mega ", "micro", "milli",
"nano ", "peta ", "pico ", "tera "
};
これは、文字列の配列です。(文字列の意味については、国際単位系の接頭辞を参照して下さい。)この中から、"deca "を効率良く探すには、どうすれば良いでしょうか。その方法のひとつとして、バイナリサーチがあります。バイナリサーチでは、以下の手順でキー(検索対象のデータ)を探します。
配列の中央の要素とキーを比較。
もし等しければ、それが検索対象のデータなので、呼び出し元へ戻る。
もしキーの方が大きければ、キーは中央の要素より右にあるので、中央の要素+1から右を探す。
もしキーの方が小さければ、キーは中央の要素より左にあるので、左端の要素から、中央の要素−1までを探す。
以上の手順を繰り返すことにより、検索対象の配列の要素が減少していきます。ひとつのステップで半分になり、効率良く検索ができます。
この様にデーターを分割しながら探索などの処理をすることを、分割統治法といいます。 */
#include <stdio.h>
#include <string.h> /* strcmp( ), size_t で必要 */
#define NUM_DATA 16
const char *base[NUM_DATA] = {"atto", "centi", "deca ", "deci ",
"exa ", "femto", "giga ", "hecto",
"kilo ", "mega ", "micro", "milli",
"nano ", "peta ", "pico ", "tera "
};
/* バイナリサーチを行う */
int BSearch(const char *key, const char *base[ ], int bottom, int top);
void main(void);
int BSearch(const char *key, const char *base[ ], int bottom, int top)
{
int middle;
int temp;
if (bottom == top) /* 探索範囲が0になったら */
return (-1); /* 戻り値を訂正。Oさんご指摘ありがとうございました。 */
middle = (top + bottom) / 2; /* 中央の要素を求める */
/* 一致したらリターンする */
if ((temp = strcmp(key, base[middle])) == 0)
return (middle);
else if (temp > 0) /* 中央の要素より右を探す */
/* Oさんのご指摘により、訂正 */
if(top == middle + 1)
BSearch(key, base, middle, top + 1);
else
BSearch(key, base, middle + 1, top);
/* 訂正終り */
else /* 中央の要素より左を探す */
BSearch(key, base, bottom, middle);
}
void main(void)
{
int i;
int temp;
const char *key = "tera "; /* 検索対象の文字列 */
int top = NUM_DATA - 1;
int bottom = 0;
printf("キーワード:%s\n", key);
printf("検索対象のデータ:\n", key);
for (i = 0; i < NUM_DATA; i++)
printf("\t%s\n", base[i]);
if ((temp = BSearch(key, base, bottom, top)) != -1)
printf("\n見つかりました: %s は %d 番目の要素です。\n",
base[temp], temp + 1);
else
printf("\n見つかりません。\n");
}
|
[ヒープというデータ構造]←このソース→[分割コンパイル]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−