vadimk772336

Untitled

Nov 24th, 2021 (edited)
837
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.28 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <cstdlib> // для функций rand() и srand()
  4. #include <list>
  5. using namespace std;
  6.  
  7. const int p = 2000000033;
  8. const int c = 3;
  9.  
  10.  
  11. int rand_int(int min, int max)
  12. {
  13.     static const double fraction = 1.0 / (static_cast<double>(RAND_MAX) + 1.0);
  14.     // Равномерно распределяем рандомное число в нашем диапазоне
  15.     return static_cast<int>(rand() * fraction * (max - min + 1) + min);
  16. }
  17.  
  18. int uni_hash(int a, int b, int m, int key)
  19. {
  20.     return ((a * key + b) % p) % m;
  21. }
  22.  
  23. struct vertex
  24. {
  25.     bool visited = false;
  26.     vector<struct adj_vertex> adj_list;
  27.     int list_size = 0;
  28.     int label;
  29. };
  30.  
  31. struct adj_vertex
  32. {
  33.     int idx;
  34.     int edge_value;
  35.     int value;
  36.     vertex* to_vertex;
  37. };
  38.  
  39. class Graph
  40. {
  41.     vertex* vertexes;
  42.     int size;
  43.  
  44. public:
  45.     Graph(int n);
  46.     int get_size();
  47.     void addEdge(int i, int j, int key);
  48.     void print_graph();
  49.     void DFS(vertex* v, int value, bool* flag);
  50.     bool is_correct();
  51. };
  52.  
  53. Graph::Graph(int n)
  54. {
  55.     vertexes = new vertex[n];
  56.     size = n;
  57. }
  58.  
  59. int Graph::get_size()
  60. {
  61.     return this->size;
  62. }
  63.  
  64. void Graph::addEdge(int i, int j, int key)
  65. {
  66.  
  67.     adj_vertex tmp;
  68.     tmp.idx = j;
  69.     tmp.edge_value = key;
  70.     tmp.to_vertex = &vertexes[j];
  71.  
  72.     vertexes[i].adj_list.push_back(tmp);
  73.     vertexes[i].list_size++;
  74.  
  75.     tmp.idx = i;
  76.     tmp.to_vertex = &vertexes[i];
  77.  
  78.     vertexes[j].adj_list.push_back(tmp);
  79.     vertexes[j].list_size++;
  80. }
  81.  
  82.  
  83. void Graph::print_graph()
  84. {
  85.     cout << "\n print:" << endl;
  86.     for (int i = 0; i < size; i++)
  87.     {
  88.         cout << "visited = " << vertexes[i].visited << "; i= " << i << ": ";
  89.         int size = vertexes[i].adj_list.size();
  90.         for (int j = 0; j < size; ++j)
  91.         {
  92.             cout << vertexes[i].adj_list[j].idx << " ";
  93.         }
  94.         cout << endl;
  95.     }
  96. }
  97.  
  98. void Graph::DFS(vertex* v, int value, bool* flag) //мб лучше не по указателю по индексу
  99. {
  100.  
  101.     v->visited = true;
  102.     v->label = value;
  103.  
  104.     vector<struct adj_vertex> adj_list
  105.         = v->adj_list; // adj_list хранит список вершин, инцедентных v
  106.     vertex* u;
  107.  
  108.     for (int i = 0; i < v->list_size; ++i)
  109.     {
  110.         if (flag)
  111.         {
  112.             u = adj_list[i].to_vertex;
  113.             if (!u->visited)
  114.             {
  115.                 int val = adj_list[i].edge_value - v->label;
  116.                 DFS(u, val, flag);
  117.             }
  118.             else
  119.             {
  120.                 if (u->label + v->label != adj_list[i].edge_value)
  121.                 {
  122.                     *flag = false;
  123.                     break;
  124.                 }
  125.             }
  126.         }
  127.         else
  128.             break;
  129.     }
  130. }
  131.  
  132. bool Graph::is_correct()
  133. {
  134.     bool flag = true;
  135.     for (int i = 0; i < this->size; ++i)
  136.     {
  137.         if (!vertexes[i].visited)
  138.             DFS(&vertexes[i], 0, &flag);
  139.         if (!flag)
  140.             return false;
  141.     }
  142.     return true;
  143. }
  144.  
  145.  
  146. class FixedSet
  147. {
  148.     int count_numbers;
  149.     int size;
  150.     int a1, a2, b1, b2;
  151.     vector<int> table;
  152.     vector<int> A;
  153.  
  154. public:
  155.     FixedSet();
  156.     void Initialize(const vector<int>& numbers);
  157.     bool Contains(int number) const;
  158.     void print();
  159. };
  160.  
  161. FixedSet::FixedSet()
  162. {
  163.     this->count_numbers = 0;
  164.     this->size = 0;
  165. }
  166.  
  167. void FixedSet::Initialize(const vector<int>& numbers)
  168. {
  169.  
  170.     srand(4541);
  171.     this->count_numbers = numbers.size(); //Число чисел для хранения
  172.     this->size = (this->count_numbers) * c; //Размер графа
  173.  
  174.     int n = this->count_numbers;
  175.     int m = this->size;
  176.     this->table.resize(m);
  177.     this->A.resize(m);
  178.  
  179.     int a, b;
  180.     int alpha_k, beta_k;
  181.  
  182.     bool flag = true;
  183.     while (flag)
  184.     {
  185.         Graph g(m);
  186.  
  187.         a1 = rand_int(1, p - 1);
  188.         b1 = rand_int(0, p - 1);
  189.         a2 = rand_int(1, p - 1);
  190.         b2 = rand_int(0, p - 1);
  191.  
  192.         for (int i = 0; i < n; ++i)
  193.         {
  194.             alpha_k = uni_hash(a1, b1, m, numbers[i]);
  195.             beta_k = uni_hash(a2, b2, m, numbers[i]);
  196.             g.addEdge(alpha_k, beta_k, numbers[i]);
  197.         }
  198.  
  199.         //Граф построен, осталось проверить что он корректный. Вызову DFS и он ответит yes or no
  200.  
  201.         if (g.is_correct())
  202.         {
  203.             flag = true;
  204.             this->a1 = a1;
  205.             this->a2 = a2;
  206.             this->b1 = b1;
  207.             this->b2 = b2;
  208.         }
  209.     }
  210.  
  211.  
  212.     //Массив А заполнен, можно заполнить хэш таблицу используя построенную ХФ
  213.     int idx;
  214.     for (int i = 0; i < m; ++i)
  215.     {
  216.         idx = (A[uni_hash(a1, b1, m, numbers[i])] + A[uni_hash(a2, b2, m, numbers[i])]) % m;
  217.         this->A[idx] = numbers[i];
  218.     }
  219. }
  220.  
  221. bool FixedSet::Contains(int number) const
  222. {
  223.     int m = this->size;
  224.     int idx= (A[uni_hash(this->a1, this->b1, m, number)] + A[uni_hash(this->a2, this->b2, m, number)]) % m;
  225.  
  226.     if (0 <= idx < m)
  227.         return (this->table[idx] == number);
  228.  
  229.     return false;
  230. }
  231.  
  232. int main()
  233. {
  234.     FixedSet set;
  235.  
  236.     vector<int> a = {1,2,3};
  237.     set.Initialize(a);
  238.     cout << set.Contains(1) << endl;
  239.  
  240.  
  241.     return 0;
  242. }
  243.  
Advertisement
Add Comment
Please, Sign In to add comment