/****************************/ /* 二分探索木 */ /* coded by Y.Suganuma */ /****************************/ #include <stdio.h> #include <time.h> #include <set> #include "MT.h" using namespace std; /********************/ /* クラスListの定義 */ /********************/ class List { int st; List *left, *right; public : // コンストラクタ List () { st = -1; left = NULL; right = NULL; } List (int s) { left = NULL; right = NULL; st = s; } int add(List *); // データの追加 int search(int); // データの探索 }; /***************************************/ /* データの追加 */ /* dt : Listクラスのオブジェクト */ /* return : =1 : 追加 */ /* =0 : 同じデータが存在 */ /***************************************/ int List::add(List *dt) { List *lt = this; int sw = -1; // トップ if (lt->st < 0) { lt->st = dt->st; sw = 1; } // トップでない else { while (sw < 0) { int k = dt->st - lt->st; // 同じデータがある if (k == 0) sw = 0; // 大きい else if (k > 0) { if (lt->right == NULL) { lt->right = dt; sw = 1; } else lt = lt->right; } // 小さい else { if (lt->left == NULL) { lt->left = dt; sw = 1; } else lt = lt->left; } } } return sw; } /***********************************/ /* データの探索 */ /* st : 数値 */ /* return : =1 : 見つかった */ /* =0 : 見つからない */ /***********************************/ int List::search(int st) { List *lt = this; int sw = 0; if (lt->st >= 0) { while (sw == 0 && lt != NULL) { int k = st - lt->st; // 見つかった if (k == 0) sw = 1; // 次のデータ else if (k > 0) lt = lt->right; else lt = lt->left; } } return sw; } /****************/ /* main program */ /****************/ int main () { int n = 0, s[100000]; List base; // データの追加 printf("二分探索木\n"); clock_t tm1 = clock(); for (int i1 = 0; i1 < 5000000; i1++) { int k = genrand_int31(); List *lt = new List(k); int sw = base.add(lt); if (sw > 0) { if (i1%50 == 0 && n < 100000) { s[n] = k; n++; } } else i1--; } clock_t tm2 = clock(); printf(" 保存: %d ms\n", (int)(tm2-tm1)); // 探索 for (int i1 = 0; i1 < n; i1++) base.search(s[i1]); clock_t tm3 = clock(); printf(" 探索: %d ms\n", (int)(tm3-tm2)); // データの追加(set) printf("set\n"); n = 0; set<int> st; for (int i1 = 0; i1 < 5000000; i1++) { int k = genrand_int31(); pair<set<int>::iterator, bool> sw = st.insert(k); if (sw.second) { if (i1%50 == 0 && n < 100000) { s[n] = k; n++; } } else i1--; } clock_t tm4 = clock(); printf(" 保存(set): %d ms\n", (int)(tm4-tm3)); // 探索 for (int i1 = 0; i1 < n; i1++) st.find(s[i1]); clock_t tm5 = clock(); printf(" 探索(set): %d ms\n", (int)(tm5-tm4)); return 0; }