vadimk772336

Untitled

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