vadimk772336

Починил удаление (много саут)

Nov 1st, 2021
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.31 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4.  
  5. using namespace std;
  6.  
  7. enum heap_type
  8. {
  9. heap_max = 0,
  10. heap_min = 1
  11. };
  12.  
  13. class Heap
  14. {
  15. std::vector<int> h;
  16. std::vector<int> ID_to_HeapIdx;
  17. int heap_size;
  18. int curr_ID;
  19.  
  20. public:
  21. Heap();
  22. void siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  23. void siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  24. void add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID);
  25. void delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID);
  26. bool isempty();
  27. void out();
  28. int get_root();
  29. };
  30.  
  31. Heap::Heap()
  32. {
  33. std::vector<int> h;
  34. heap_size = 0;
  35. std::vector<int> ID_to_HeapIdx;
  36. }
  37.  
  38. int Heap::get_root()
  39. {
  40. if (heap_size > 0)
  41. return h[0];
  42. return -1;
  43. }
  44.  
  45. bool Heap::isempty()
  46. {
  47. if (heap_size == 0)
  48. return true;
  49. return false;
  50. }
  51.  
  52. void Heap::siftup(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  53. {
  54. int curr, parent, tmp;
  55. curr = heap_size - 1;
  56. parent = (curr - 1);
  57. for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  58. for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  59. while (parent >= 0 && curr > 0)
  60. {
  61.  
  62. if (sort_type == heap_max & h[parent] < h[curr])
  63. {
  64.  
  65. int buff = h[curr];
  66. h[curr] = h[parent];
  67. h[parent] = buff;
  68.  
  69. tmp = HeapIdx_to_ID[parent];
  70. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  71. HeapIdx_to_ID[curr] = tmp;
  72.  
  73.  
  74. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  75. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  76. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  77. }
  78.  
  79. if (sort_type == heap_min & h[parent] > h[curr])
  80. {
  81.  
  82. int buff = h[curr];
  83. h[curr] = h[parent];
  84. h[parent] = buff;
  85.  
  86. tmp = HeapIdx_to_ID[parent];
  87. HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];
  88. HeapIdx_to_ID[curr] = tmp;
  89.  
  90.  
  91. tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  92. ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  93. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  94. }
  95. curr = parent;
  96. parent = (curr - 1);
  97. }
  98. }
  99.  
  100. void Heap::add(int sort_type, int vertex, int ID, std::vector<int>& HeapIdx_to_ID)
  101. {
  102.  
  103. h.push_back(vertex);
  104. ID_to_HeapIdx.push_back(heap_size);
  105. HeapIdx_to_ID.push_back(ID);
  106.  
  107. cout << "Только что добавили элемент в конец кучи" << endl;
  108. if (sort_type == heap_max)
  109. cout << "ID_to_Heap1Idx[ID]= " ;
  110. else
  111. cout << "ID_to_Heap2Idx[ID]= " ;
  112. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  113. cout << ID_to_HeapIdx[j] << " ";
  114. cout << endl;
  115. cout << endl;
  116.  
  117. if (sort_type == heap_max)
  118. cout << "HeapIdx1_to_ID[ID]= " ;
  119. else
  120. cout << "HeapIdx2_to_ID[ID]= " ;
  121. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  122. cout << HeapIdx_to_ID[j] << " ";
  123. cout << endl;
  124. cout << endl;
  125.  
  126. heap_size++;
  127. siftup(sort_type, ID, HeapIdx_to_ID);
  128.  
  129. cout << "После сифтапа" << endl;
  130. cout << "Только что добавили элемент в конец кучи" << endl;
  131. if (sort_type == heap_max)
  132. cout << "ID_to_Heap1Idx[ID]= " ;
  133. else
  134. cout << "ID_to_Heap2Idx[ID]= " ;
  135. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  136. cout << ID_to_HeapIdx[j] << " ";
  137. cout << endl;
  138. cout << endl;
  139.  
  140. if (sort_type == heap_max)
  141. cout << "HeapIdx1_to_ID[ID]= " ;
  142. else
  143. cout << "HeapIdx2_to_ID[ID]= " ;
  144. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  145. cout << HeapIdx_to_ID[j] << " ";
  146. cout << endl;
  147. cout << endl;
  148.  
  149. }
  150.  
  151. void Heap::siftdown(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  152. {
  153. int parent, max_child, min_child, tmp, buff;
  154.  
  155. int curr = ID_to_HeapIdx[ID];
  156. ID_to_HeapIdx[ID] = -100;
  157. int child_l = 2 * curr + 1;
  158. int child_r = 2 * curr + 2;
  159.  
  160.  
  161. if (h[child_r] < h[child_l])
  162. {
  163. max_child = child_l;
  164. min_child = child_r;
  165. }
  166. else
  167. {
  168. max_child = child_r;
  169. min_child = child_l;
  170. }
  171. while (child_l < heap_size)
  172. {
  173.  
  174.  
  175. if (sort_type == heap_max)
  176. {
  177. if (child_l == heap_size - 1)
  178. max_child = child_l;
  179.  
  180. else if (h[child_r] < h[child_l])
  181. max_child = child_l;
  182. else
  183. max_child = child_r;
  184. }
  185.  
  186. if (sort_type == heap_min)
  187. {
  188. if (child_l == heap_size - 1)
  189. min_child = child_l;
  190. else if (h[child_r] < h[child_l])
  191. min_child = child_r;
  192. else
  193. min_child = child_l;
  194. }
  195.  
  196. if (sort_type == heap_max & h[curr] < h[max_child])
  197. {
  198.  
  199. buff = h[curr];
  200. h[curr] = h[max_child];
  201. h[max_child] = buff;
  202.  
  203. tmp = HeapIdx_to_ID[max_child];
  204. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  205. HeapIdx_to_ID[curr] = tmp;
  206.  
  207. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  208. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  209. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  210. }
  211.  
  212. if (sort_type == heap_min & h[curr] > h[max_child])
  213. {
  214.  
  215. buff = h[curr];
  216. h[curr] = h[max_child];
  217. h[max_child] = buff;
  218.  
  219. tmp = HeapIdx_to_ID[max_child];
  220. HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  221. HeapIdx_to_ID[curr] = tmp;
  222.  
  223. tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  224. ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  225. ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  226. }
  227. curr = max_child;
  228. child_l = 2 * curr + 1;
  229. child_r = 2 * curr + 2;
  230. }
  231. }
  232.  
  233.  
  234. void Heap::delete_vertex(int sort_type, int ID, std::vector<int>& HeapIdx_to_ID)
  235. {
  236. int pos = ID_to_HeapIdx[ID];
  237.  
  238. cout << "поступил запрос на удаление по ID= " << ID << "pos in heap = " << pos << endl;
  239. cout << "h[pos]" << h[pos] << endl;
  240.  
  241. cout << "До каких либо действий" << endl;
  242. if (sort_type == heap_max)
  243. cout << "ID_to_Heap1Idx[ID]= " ;
  244. else
  245. cout << "ID_to_Heap2Idx[ID]= " ;
  246. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  247. cout << ID_to_HeapIdx[j] << " ";
  248. cout << endl;
  249. cout << endl;
  250.  
  251. if (sort_type == heap_max)
  252. cout << "HeapIdx1_to_ID[ID]= " ;
  253. else
  254. cout << "HeapIdx2_to_ID[ID]= " ;
  255. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  256. cout << HeapIdx_to_ID[j] << " ";
  257. cout << endl;
  258. cout << endl;
  259.  
  260. h[pos] = h[heap_size - 1];
  261. h.pop_back();
  262. heap_size--;
  263. //ID_to_HeapIdx[HeapIdx_to_ID[pos]] = -100; //Беру айди элемента pos и теперь Id[id] = -100;
  264. int id_last_el = HeapIdx_to_ID[heap_size];
  265. //cout << "id_last_el=" << id_last_el << endl;
  266. HeapIdx_to_ID[pos] = id_last_el;
  267. HeapIdx_to_ID[heap_size] = -100;
  268. ID_to_HeapIdx[id_last_el] = pos; //Дают айди послед эл, а он уже на Pos
  269. //ID_to_HeapIdx[ID] = -100;
  270.  
  271. cout << "До сифтдауна" << endl;
  272. if (sort_type == heap_max)
  273. cout << "ID_to_Heap1Idx[ID]= " ;
  274. else
  275. cout << "ID_to_Heap2Idx[ID]= " ;
  276. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  277. cout << ID_to_HeapIdx[j] << " ";
  278. cout << endl;
  279. cout << endl;
  280.  
  281. if (sort_type == heap_max)
  282. cout << "HeapIdx1_to_ID[ID]= " ;
  283. else
  284. cout << "HeapIdx2_to_ID[ID]= " ;
  285. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  286. cout << HeapIdx_to_ID[j] << " ";
  287. cout << endl;
  288. cout << endl;
  289.  
  290. siftdown(sort_type, ID, HeapIdx_to_ID);
  291. cout << "ID_to_HeapIdx[HeapIdx_to_ID[pos]] = " << ID_to_HeapIdx[HeapIdx_to_ID[pos]] << endl;
  292.  
  293.  
  294. cout << "POSLE" << endl;
  295. if (sort_type == heap_max)
  296. cout << "ID_to_Heap1Idx[ID]= " ;
  297. else
  298. cout << "ID_to_Heap2Idx[ID]= " ;
  299. for (int j=0;j < ID_to_HeapIdx.size(); j++)
  300. cout << ID_to_HeapIdx[j] << " ";
  301. cout << endl;
  302. cout << endl;
  303.  
  304. if (sort_type == heap_max)
  305. cout << "HeapIdx1_to_ID[ID]= " ;
  306. else
  307. cout << "HeapIdx2_to_ID[ID]= " ;
  308. for (int j=0;j < HeapIdx_to_ID.size(); j++)
  309. cout << HeapIdx_to_ID[j] << " ";
  310. cout << endl;
  311. cout << endl;
  312. }
  313.  
  314.  
  315. void Heap::out(void)
  316. {
  317.  
  318. for (int i = 0; i < heap_size; i++)
  319. {
  320. cout << h[i] << " ";
  321. }
  322. cout << endl;
  323. }
  324.  
  325.  
  326. int main()
  327. {
  328. Heap heap;
  329. std::vector<int> HeapIdx_to_ID;
  330. heap.add(heap_max,1,0,HeapIdx_to_ID); //1
  331. heap.out();
  332. cout << "----------------------------" << endl << endl;
  333. heap.add(heap_max,4,1,HeapIdx_to_ID); //4 1
  334. heap.out();
  335. cout << "----------------------------" << endl << endl;
  336. heap.add(heap_max,5,2,HeapIdx_to_ID); //5 4 1
  337. heap.out();
  338. cout << "----------------------------" << endl << endl;
  339. heap.add(heap_max,2,3,HeapIdx_to_ID); //5(2) 4(1) 2(3) 1(0) , ID = 3 1 0 2 - где лежит .. айдишник
  340. heap.out();
  341. cout << "----------------------------" << endl << endl;
  342. heap.delete_vertex(heap_max,2,HeapIdx_to_ID); //4(1) 1(0) 2(3) -100 , ID = 1 0 -100 2 (WA 4 1 2)
  343. heap.out();
  344.  
  345. cout << "----------------------------" << endl << endl;
  346. heap.delete_vertex(heap_max,3,HeapIdx_to_ID); //4 1
  347. heap.out();
  348. cout << "----------------------------" << endl << endl;
  349. heap.delete_vertex(heap_max,1,HeapIdx_to_ID); //1
  350. heap.out();
  351. cout << "----------------------------" << endl << endl;
  352. heap.delete_vertex(heap_max,0,HeapIdx_to_ID); //
  353. heap.out();
  354. cout << "----------------------------" << endl << endl;
  355.  
  356.  
  357.  
  358. return 0;
  359. }
  360.  
Advertisement
Add Comment
Please, Sign In to add comment