スピード勝負 | spin on the RITZ

スピード勝負

アルゴリズムに大切なことは

・わかりやすい

・メモリ使用量が少ない

・速い

・スタイリッシュ&エレガント←


4つ目要るのか?




そげなことは置いときまして


『100万個のデータに対して、線形探索と二分探索ではどちらが速いのか?』


って問題があるわけですが、まぁ考えるまでもなく二分探索でしょう



データ数n、探索する数mの時、


線形探索の場合はO(nm)

二分探索の場合は、探索前にソートする必要があるのでO(nlogn) + O(mlogn)


ぶっちゃけ、探索数が少ないときは線形探索の方が速いんだよな

探索数が少ないとき、二分探索全体では(ソートする時間) > (探索する時間)だからだろうね



#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#include <mmsystem.h>

const int SEARCH = 500000;

int cmp(const void *a, const void *b)
{
    return *(int*)a - *(int*)b;
}

int main(void)
{
    int *data;
    int search[SEARCH];
    int i, j, count = 0;
    FILE *fp;
    int start, end;

//  for (i = 0;i < 1000000;i++)
//      printf("%d\n", rand()%5000000);
    
    data = (int*)malloc(sizeof(int)*1000000);
    fp = fopen("rand_data.txt", "r");

    srand(10);
    for (i = 0;i < SEARCH;i++)
        search[i] = rand()%5000000;
    for (i = 0;i < 1000000;i++)
        fscanf(fp, "%d", &data[i]);

/*
///////////////////////////////////////////////////

    count = 0;
    start = timeGetTime();
    for (i = 0;i < SEARCH;i++) {
        for (j = 0;j < 1000000;j++) {
            if (search[i] == data[j]) {
                count++;
                break;
            }
        }
    }
    end = timeGetTime();
    printf("liner search\n");
    printf("Match : %d\n", count);
    printf("Time  : %d msec\n", end-start);

///////////////////////////////////////////////////
*/


    start = timeGetTime();
    count = 0;
    qsort(data, 1000000, sizeof(int), cmp);
    for (i = 0;i < SEARCH;i++) {
        if (bsearch(&search[i], data, 1000000, sizeof(int), cmp) != NULL)
            count++;
    }
    end = timeGetTime();
    printf("quick sort + binary search\n");
    printf("Match : %d\n", count);
    printf("Time  : %d msec\n", end-start);

///////////////////////////////////////////////////

    return 0;   
}