Advertisement
Taraxacum

Sort of Distributed Data

Mar 26th, 2020
715
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.99 KB | None | 0 0
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <random>
  5. #include <tuple>
  6. #include <vector>
  7.  
  8. template <class ValType, class Dist>
  9. std::vector<ValType> generate_experiment(size_t n, Dist dist)
  10. {
  11.     std::random_device rd;
  12.     std::mt19937 reng(rd());
  13.  
  14.     std::vector<ValType> vec;
  15.     vec.reserve(n);
  16.  
  17.     while (vec.size() < n) {
  18.         vec.push_back(dist(reng));
  19.     }
  20.  
  21.     return vec;
  22. }
  23.  
  24. unsigned long bucket_sort(std::vector<double>& data)
  25. {
  26.     size_t n = data.size();
  27.     auto mm = std::minmax_element(data.begin(), data.end());
  28.  
  29.     double inf = *std::get<0>(mm), sup = *std::get<1>(mm);
  30.     double step = (sup - inf + 1) / n;
  31.  
  32.     std::vector<std::vector<double>> buckets(n);
  33.  
  34.     unsigned long cnt = 0;
  35.  
  36.     for (double elem : data) {
  37.         size_t bucket_idx = (elem - inf) / step;
  38.         cnt += buckets[bucket_idx].size();
  39.         buckets[bucket_idx].push_back(elem);
  40.     }
  41.  
  42.     return cnt;
  43. }
  44.  
  45. int main(int argc, char const* argv[])
  46. {
  47.     constexpr size_t exp_cnt = 256;
  48.  
  49.     for (int n = 16; n < 8192; n += 16) {
  50.         std::ofstream fout_u("uniform.csv", std::ios::app);
  51.         std::uniform_real_distribution<double> dist_u(0, n);
  52.         for (size_t i = 0; i < exp_cnt; i++) {
  53.             std::vector<double> vec = generate_experiment<double>(n, dist_u);
  54.             auto cnt = bucket_sort(vec);
  55.  
  56.             fout_u << n << "," << cnt << std::endl;
  57.             printf("%s \t %d \t %lu \t %lu \n", "uniform", n, i, cnt);
  58.         }
  59.         fout_u.close();
  60.  
  61.         std::ofstream fout_n("normal.csv", std::ios::app);
  62.         std::normal_distribution<double> dist_n(0, n / 3);
  63.         for (size_t i = 0; i < exp_cnt; i++) {
  64.             std::vector<double> vec = generate_experiment<double>(n, dist_n);
  65.             auto cnt = bucket_sort(vec);
  66.  
  67.             fout_n << n << "," << cnt << std::endl;
  68.             printf("%s \t %d \t %lu \t %lu \n", "uniform", n, i, cnt);
  69.         }
  70.         fout_n.close();
  71.     }
  72.  
  73.     return 0;
  74. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement