/****************************/ /* 二分探索 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <algorithm> #include "MT.h" using namespace std; /*************************/ /* データの比較(昇順) */ /* bsearch 用 */ /*************************/ int compare_n(const void *arg1, const void *arg2) { int *a1 = (int *)arg1; int *a2 = (int *)arg2; return *a1 - *a2; } /**************************************/ /* 二分探索( Binary Search ) */ /* key : 探索するキーデータ */ /* data : データ */ /* n : データ数 */ /* return : 1 : 見つかった */ /* 0 : 見つからなかった */ /**************************************/ bool search(int key, int *data, int n) { int sw = 0, left = 0, right = n-1, center; if (data[right] > data[left]) { while (left < right) { center = (left + right) / 2; if (data[center] < key) left = (center < n-1) ? center + 1 : center; else right = center; } } else { while (left < right) { center = (left + right) / 2; if (data[center] > key) left = (center < n-1) ? center + 1 : center; else right = center; } } if (data[left] == key) sw = 1; return sw; } #define N 5000000 int main() { // 初期設定 int s[100000], n = 0; int *data = new int [N]; init_genrand((unsigned)time(NULL)); // データの設定 clock_t tm1 = clock(); for (int i1 = 0; i1 < N; i1++) { data[i1] = genrand_int31(); if (i1%50 == 0 && n < 100000) { s[n] = data[i1]; n++; } } clock_t tm2 = clock(); printf("保存: %d ms\n", (int)(tm2-tm1)); // データのソート sort(data, data+N); clock_t tm3 = clock(); printf("sort: %d ms\n", (int)(tm3-tm2)); // データの探索 for (int i1 = 0; i1 < n; i1++) { int sw = search(s[i1], data, N); if (sw == 0) { printf("***error*** データが見つからない!\n"); exit(1); } } clock_t tm4 = clock(); printf(" 探索: %d ms\n", (int)(tm4-tm3)); // データの探索(標準関数 bsearch の利用) for (int i1 = 0; i1 < n; i1++) { int *sw = (int *)bsearch(&s[i1], data, N, sizeof(int), compare_n); if (sw == NULL) { printf("***error*** データが見つからない!\n"); exit(1); } } clock_t tm5 = clock(); printf(" 探索(bsearch): %d ms\n", (int)(tm5-tm4)); // データの探索(C++ 標準ライブラリ binary_search の利用) for (int i1 = 0; i1 < n; i1++) { bool sw = binary_search(data, data+N, s[i1]); if (!sw) { printf("***error*** データが見つからない!\n"); exit(1); } } clock_t tm6 = clock(); printf(" 探索(binary_search): %d ms\n", (int)(tm6-tm5)); return 0; }