2013年4月16日火曜日

開発環境

プログラミング言語C 第2版 ANSI規格準拠 (B.W. カーニハン D.M. リッチー (著)、 石田 晴久 (翻訳)、共立出版)の第3章(制御の流れ)、3.3(Else-If)の演習 3-1を解いてみる。

その他参考書籍

演習 3-1.

コード

sample.c

#include <stdio.h>

int binsearch(int x, int v[], int n);

int main()
{
    enum last {LENGTH = 1000000};
    int v[LENGTH];
    int i, index;
    
    for (i = 0; i < LENGTH; i++)
        v[i] = i;
    
    index = binsearch(5, v, LENGTH);
    printf("%d\n", index);
    index = binsearch(-10, v, LENGTH);
    printf("%d\n", index);
    
    /* 実行速度の差を確認するため */
    for ( i = 0; i < 10000000; i++) {
        index = binsearch(5, v, LENGTH);
    }
    return 0;
}

int binsearch(int x, int v[], int n)
{
    int low, high, mid;
    
    low = 0;
    high = n - 1;
    mid = (low + high) / 2;
    while (low <= high && x != v[mid]) {
        if (x < v[mid])
            high = mid - 1;
        else
            low = mid + 1;
        mid = (low + high) / 2;
    }
    
    if (x == v[mid])
        return mid;
    
    return -1;
}

入出力結果(Terminal)

$ time ./a.out
5
-1

real 0m2.044s
user 0m1.994s
sys 0m0.009s
$

ループの中で二つのテストを行っている場合の実行時間。

コード

sample.c

#include <stdio.h>

int binsearch(int x, int v[], int n);

int main()
{
    enum last {LENGTH = 1000000};
    int v[LENGTH];
    int i, index;
    
    for (i = 0; i < LENGTH; i++)
        v[i] = i;
    
    index = binsearch(5, v, LENGTH);
    printf("%d\n", index);
    index = binsearch(-10, v, LENGTH);
    printf("%d\n", index);
    
    /* 実行速度の差を確認するため */
    for ( i = 0; i < 10000000; i++) {
        index = binsearch(5, v, LENGTH);
    }
    return 0;
}

int binsearch(int x, int v[], int n)
{
    int low, high, mid;
    
    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low + high) / 2;
        if (x < v[mid])
            high = mid - 1;
        else if (x > v[mid])
            low = mid + 1;
        else
            return mid;
    }
    return -1;
}

入出力結果(Terminal)

$ time ./a.out
5
-1

real 0m1.813s
user 0m1.799s
sys 0m0.006s
$

1回だけではそんなに差が出なかったから、for loopで何回も検索するようにしてみたものの、そんなに差が出なかった。(というか、while loopの中で2回テストする方が実行速度が速いという結果に。。)

0 コメント:

コメントを投稿