Advertisement
Guest User

Untitled

a guest
Apr 25th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.38 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. #include <vector>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. const int length = 1<<16;
  8.  
  9. int i_rand = 0;
  10. int i_rang = 0;
  11. int i_cnt = 0;
  12.  
  13. vector<int> parent(length);
  14. vector<int> rang(length);
  15. vector<int> cnt(length);
  16.  
  17. vector<pair<int, int>> q, w, e;
  18.  
  19. void make_set(int v) {
  20.     parent[v] = v;
  21.     rang[v] = 1;
  22.     cnt[v] = 1;
  23. }
  24.  
  25. void make_elem() {
  26.     for (size_t i = 0; i < length; ++i) {
  27.         make_set(i);
  28.     }
  29. }
  30.  
  31. int find_set_rand(int v) {
  32.     i_rand++;
  33.     if (v == parent[v])
  34.         return v;
  35.     return parent[v] = find_set_rand(parent[v]);
  36. }
  37.  
  38. int find_set_rang(int v) {
  39.     i_rang++;
  40.     if (v == parent[v])
  41.         return v;
  42.     return parent[v] = find_set_rang(parent[v]);
  43. }
  44.  
  45. int find_set_cnt(int v) {
  46.     i_cnt++;
  47.     if (v == parent[v])
  48.         return v;
  49.     return parent[v] = find_set_cnt(parent[v]);
  50. }
  51.  
  52. void union_sets_rand(int a, int b) {
  53.     a = find_set_rand(a);
  54.     b = find_set_rand(b);
  55.     if (a == b) {
  56.         return;
  57.     }
  58.     srand(b);
  59.     int random = rand() % 2;
  60.     if (random == 0) {
  61.         parent[a] = b;
  62.     }
  63.     else {
  64.         parent[b] = a;
  65.     }
  66. }
  67.  
  68. void union_sets_rang(int a, int b) {
  69.     a = find_set_rang(a);
  70.     b = find_set_rang(b);
  71.     if (a == b) {
  72.         return;
  73.     }
  74.     if (rang[a] < rang[b]) {
  75.         swap(a, b);
  76.     }
  77.     parent[b] = a;
  78.     if (rang[a] == rang[b]) {
  79.         rang[a]++;
  80.     }
  81. }
  82.  
  83. void union_sets_cnt(int a, int b) {
  84.     a = find_set_cnt(a);
  85.     b = find_set_cnt(b);
  86.     if (a == b) {
  87.         return;
  88.     }
  89.     if (cnt[a] < cnt[b]) {
  90.         swap(a, b);
  91.     }
  92.     parent[b] = a;
  93.     cnt[a] += cnt[b];
  94. }
  95.  
  96. void merge (int l) {
  97.     if (l > length) {
  98.         return;
  99.     }
  100.     for (size_t i = 0; i < length - l + 1; i += l) {
  101.         q.push_back(make_pair(i, i + l - 1));
  102.     }
  103.     merge(l * 2);
  104. }
  105.  
  106. void rand(int n) {
  107.     for (size_t i = 0; i < n; ++i) {
  108.         int x = rand() % length;
  109.         int y = rand() % length;
  110.         w.push_back(make_pair(x, y));
  111.     }
  112. }
  113.  
  114. void step() {
  115.     for (size_t i = 1; i < length; ++i) {
  116.         int x = i - 1;
  117.         int y = i;
  118.         e.push_back(make_pair(x, y));
  119.     }
  120. }
  121.  
  122. void test_function(vector<pair<int,int>>& a) {
  123.     i_rand = 0;
  124.     i_rang = 0;
  125.     i_cnt = 0;
  126.     make_elem();
  127.     for (size_t i = 0; i < a.size(); ++i) {
  128.         int x = a[i].first;
  129.         int y = a[i].second;
  130.         x = find_set_rand(x);
  131.         y = find_set_rand(y);
  132.         union_sets_rand(x, y);
  133.     }
  134.     cout << "Random union: " << i_rand << "\n";
  135.     make_elem();
  136.     for (size_t i = 0; i < a.size(); ++i) {
  137.         int x = a[i].first;
  138.         int y = a[i].second;
  139.         x = find_set_rang(x);
  140.         y = find_set_rang(y);
  141.         union_sets_rang(x, y);
  142.     }
  143.     cout << "Rang union: " << i_rang << "\n";
  144.     make_elem();
  145.     for (size_t i = 0; i < a.size(); ++i) {
  146.         int x = a[i].first;
  147.         int y = a[i].second;
  148.         x = find_set_cnt(x);
  149.         y = find_set_cnt(y);
  150.         union_sets_cnt(x, y);
  151.     }
  152.     cout << "Count union: " << i_cnt << "\n";
  153. }
  154.  
  155.  
  156. int main() {
  157.     int n;
  158.     cin >> n;
  159.     cout << "Random test\n";
  160.     rand(n);
  161.     test_function(w);
  162.     cout << "\n";
  163.     cout << "Different size test\n";
  164.     step();
  165.     test_function(e);
  166.     cout << "\n";
  167.     cout << "Equal size test\n";
  168.     merge(2);
  169.     test_function(q);
  170.     return 0;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement