vadimk772336

Untitled

Oct 30th, 2021 (edited)
456
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.22 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. class Heap
  7. {
  8.     std::vector<int> h;
  9.     std::vector<int> ID_to_HeapIdx;
  10.     int heap_size;
  11.     int curr_ID;
  12.  
  13. public:
  14.     Heap();
  15.     void siftup(int ID,std::vector<int>& HeapIdx_to_ID);
  16.     void siftdown(int ID,std::vector<int>& HeapIdx_to_ID);
  17.     void add(int vertex,int ID,std::vector<int>& HeapIdx_to_ID);
  18.     void delete_vertex(int ID,std::vector<int>& HeapIdx_to_ID);
  19.     bool isempty();
  20.     void out();
  21.     int* get_root();
  22. };
  23.  
  24. Heap::Heap()
  25. {
  26.     std::vector<int> h;
  27.     heap_size = 0;
  28.     curr_ID = 0;
  29.     std::vector<int> ID_to_HeapIdx; //по ID находит где лежит элемент в куче
  30. }
  31.  
  32. int* Heap::get_root()
  33. {
  34.     return &h[0];
  35. }
  36.  
  37. bool Heap::isempty()
  38. {
  39.     if (heap_size == 0)
  40.         return true;
  41.     return false;
  42. }
  43.  
  44. void Heap::siftup(int ID, std::vector<int>& HeapIdx_to_ID)
  45. {
  46.     int curr, parent;
  47.     curr = heap_size - 1;
  48.     parent = (curr - 1) ;
  49.     cout << " do while HeapIdx_to_ID:";
  50.     for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  51.         cout << HeapIdx_to_ID[i] << " ";
  52.     cout << endl;
  53.    
  54.     cout << "do while  ID_to_HeapIdx:";
  55.     for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  56.         cout << ID_to_HeapIdx[i] << " ";
  57.     cout << endl;
  58.    
  59.     while (parent >= 0 && curr > 0)
  60.     {
  61.        
  62.  
  63.         if (h[parent] < h[curr])
  64.         {
  65.             cout << "parent " << parent << " curr " << curr << endl;
  66.            
  67.             cout << "do \n";
  68.             cout << "h:";
  69.             for (int i = 0; i < heap_size; i++)
  70.                 cout << h[i] << " ";
  71.             cout << endl;
  72.            
  73.             cout << "HeapIdx_to_ID:";
  74.             for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  75.                 cout << HeapIdx_to_ID[i] << " ";
  76.             cout << endl;
  77.            
  78.             cout << "ID_to_HeapIdx:";
  79.             for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  80.                 cout << ID_to_HeapIdx[i] << " ";
  81.             cout << endl;  
  82.            
  83.             int buff = h[curr];
  84.             h[curr] = h[parent];
  85.             h[parent] = buff;
  86.  
  87.             int tmp;
  88.            
  89.             tmp = HeapIdx_to_ID[parent];    
  90.             HeapIdx_to_ID[parent] = HeapIdx_to_ID[curr];  
  91.             HeapIdx_to_ID[curr] = tmp;
  92.  
  93.      
  94.             tmp = ID_to_HeapIdx[HeapIdx_to_ID[parent]];
  95.             ID_to_HeapIdx[HeapIdx_to_ID[parent]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  96.             ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  97.  
  98.              cout << "После \n";
  99.             cout << "h:";
  100.             for (int i = 0; i < heap_size; i++)
  101.                 cout << h[i] << " ";
  102.             cout << endl;
  103.            
  104.             cout << "HeapIdx_to_ID:";
  105.             for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  106.                 cout << HeapIdx_to_ID[i] << " ";
  107.             cout << endl;
  108.            
  109.             cout << "ID_to_HeapIdx:";
  110.             for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  111.                 cout << ID_to_HeapIdx[i] << " ";
  112.             cout << endl;
  113.  
  114.            
  115.         }
  116.         curr = parent;
  117.         parent = (curr - 1) ;
  118.     }
  119.    
  120. }
  121.  
  122. void Heap::add(int vertex, int ID, std::vector<int>& HeapIdx_to_ID)
  123. {
  124.  
  125.     h.push_back(vertex);
  126.     ID_to_HeapIdx.push_back(heap_size);
  127.     HeapIdx_to_ID.push_back(ID);
  128.     heap_size++;
  129.     siftup(ID, HeapIdx_to_ID);
  130. }
  131.  
  132. void Heap::siftdown(int ID,std::vector<int>& HeapIdx_to_ID)
  133. {
  134.     int parent, max_child;
  135.  
  136.     int curr = ID_to_HeapIdx[ID];
  137.     int child_l = 2 * curr + 1;
  138.     int child_r = 2 * curr + 2;
  139.  
  140.              cout << "h:";
  141.             for (int i = 0; i < heap_size; i++)
  142.                 cout << h[i] << " ";
  143.             cout << endl;
  144.            
  145.             cout << "HeapIdx_to_ID:";
  146.             for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  147.                 cout << HeapIdx_to_ID[i] << " ";
  148.             cout << endl;
  149.            
  150.             cout << "ID_to_HeapIdx:";
  151.             for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  152.                 cout << ID_to_HeapIdx[i] << " ";
  153.             cout << endl;
  154.            
  155.     if (h[child_r] < h[child_l])
  156.         max_child = child_l;
  157.     else
  158.         max_child = child_r;
  159.  
  160.     while (child_l < heap_size)
  161.     {
  162.         if (child_l == heap_size - 1)
  163.             max_child = child_l;
  164.         else if (h[child_r] < h[child_l])
  165.             max_child = child_l;
  166.         else
  167.             max_child = child_r;
  168.  
  169.         if (h[curr] < h[max_child])
  170.         {
  171.  
  172.             int buff = h[curr];
  173.             h[curr] = h[max_child];
  174.             h[max_child] = buff;
  175.  
  176.             int tmp;
  177.             tmp = HeapIdx_to_ID[max_child];
  178.             HeapIdx_to_ID[max_child] = HeapIdx_to_ID[curr];
  179.             HeapIdx_to_ID[curr] = tmp;
  180.  
  181.             tmp = ID_to_HeapIdx[HeapIdx_to_ID[max_child]];
  182.             ID_to_HeapIdx[HeapIdx_to_ID[max_child]] = ID_to_HeapIdx[HeapIdx_to_ID[curr]];
  183.             ID_to_HeapIdx[HeapIdx_to_ID[curr]] = tmp;
  184.            
  185.  
  186.         }
  187.  
  188.         curr = max_child;
  189.         child_l = 2 * curr + 1;
  190.         child_r = 2 * curr + 2;
  191.     }
  192. }
  193.  
  194.  
  195.  
  196. void Heap::delete_vertex(int ID, std::vector<int>& HeapIdx_to_ID)
  197. {
  198.     cout << "ID=" << ID << endl;
  199.     int pos = ID_to_HeapIdx[ID];
  200.     cout << "pos = " << pos << endl;
  201.  
  202.  
  203.             cout << "h:";
  204.             for (int i = 0; i < heap_size; i++)
  205.                 cout << h[i] << " ";
  206.             cout << endl;
  207.            
  208.             cout << "HeapIdx_to_ID:";
  209.             for (int i = 0; i < HeapIdx_to_ID.size(); i++)
  210.                 cout << HeapIdx_to_ID[i] << " ";
  211.             cout << endl;
  212.            
  213.             cout << "ID_to_HeapIdx:";
  214.             for (int i = 0; i < ID_to_HeapIdx.size(); i++)
  215.                 cout << ID_to_HeapIdx[i] << " ";
  216.             cout << endl;
  217.            
  218.     h[pos] = h[heap_size - 1];
  219.    
  220.     cout << "h[pos] = " << h[pos] << endl;
  221.     h.pop_back();
  222.     heap_size--;
  223.             cout << "h:";
  224.             for (int i = 0; i < heap_size; i++)
  225.                 cout << h[i] << " ";
  226.             cout << endl;
  227.     siftdown(ID, HeapIdx_to_ID);
  228. }
  229.  
  230. void Heap::out(void)
  231. {
  232.  
  233.     for (int i = 0; i < heap_size; i++)
  234.     {
  235.         cout << h[i] << " ";
  236.     }
  237.     cout << endl;
  238. }
  239.  
  240. int main()
  241. {
  242.    
  243.     /*
  244.         void siftup(int ID,std::vector<int>& HeapIdx_to_ID);
  245.     void siftdown(int ID,std::vector<int>& HeapIdx_to_ID);
  246.     void add(int vertex,int ID,std::vector<int>& HeapIdx_to_ID);
  247.     void delete_vertex(int ID,std::vector<int>& HeapIdx_to_ID);
  248.     bool isempty();
  249.     void out();
  250.     int* get_root();
  251.     */
  252.     int ID = -1;
  253.     std::vector<int> HeapIdx_to_ID;
  254.     Heap heap;
  255.    
  256.     //ID++;
  257.     cout << "--------" << endl;
  258.     ID++;
  259.     heap.add(1,ID,HeapIdx_to_ID);
  260.     cout << "heap: ";
  261.     heap.out();
  262.     cout << HeapIdx_to_ID.size() << endl;
  263.     cout << "--------" << endl;
  264.     ID++;
  265.     heap.add(3,ID,HeapIdx_to_ID);
  266.     cout << "heap: ";
  267.     heap.out();
  268.     cout << HeapIdx_to_ID.size() << endl;
  269.     cout << "--------" << endl;
  270.     ID++;
  271.     heap.add(2,ID,HeapIdx_to_ID);
  272.     cout << "heap: ";
  273.     heap.out();
  274.     cout << "--------" << endl;
  275.     cout << "de \n";
  276.     heap.delete_vertex(1,HeapIdx_to_ID);
  277.     heap.out();
  278.  
  279.     return 0;
  280. }
  281.  
Add Comment
Please, Sign In to add comment