Florii11

interclasare

Nov 4th, 2021
561
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.47 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <vector>
  4. #include "Profiler.h"
  5.  
  6. using namespace std;
  7.  
  8. Profiler profiler("average");
  9.  
  10. list <int> lista_interclasta;
  11.  
  12. struct Heap
  13. {
  14.     list<int> v;
  15.     int size;
  16. };
  17.  
  18. void print(list<int> const& list)
  19. {
  20.     for (auto it = list.cbegin(); it != list.cend(); it++)
  21.     {
  22.         cout << *it << " ";
  23.     }
  24.     cout << endl;
  25. }
  26.  
  27. void generare_liste(vector<list <int>> &lista ,int n, int k)
  28. {
  29.     for (int i = 0; i < k - 1; i++)
  30.     {
  31.         int r = rand() % (n);
  32.         while (r == 0 || (n - r) < k - i - 1)
  33.             r = rand() % (n);
  34.         n -= r;
  35.         int* v = (int*)malloc(r * sizeof(int));
  36.         FillRandomArray(v, r, 1, 100, false, 1);
  37.         for (int j = 0; j < r; j++)
  38.         {
  39.             lista[i].push_back(v[j]);
  40.         }
  41.         free(v);
  42.     }
  43.     if (n > 0) {
  44.         int* v = (int*)malloc(n * sizeof(int));
  45.         FillRandomArray(v, n, 1, 100, false, 1);
  46.         for (int j = 0; j < n; j++)
  47.         {
  48.             lista[k - 1].push_back(v[j]);
  49.         }
  50.         free(v);
  51.     }
  52. }
  53.  
  54. void test_generare()
  55. {
  56.     vector<list <int>> lista(4);
  57.     generare_liste(lista, 20, 4);
  58.     for (int i = 0; i < 4; i++)
  59.         print(lista[i]);
  60. }
  61.  
  62. int parent(int i)
  63. {
  64.     return (i - 1) / 2;
  65. }
  66.  
  67. int left(int i)
  68. {
  69.     return 2 * i + 1;
  70. }
  71.  
  72. int right(int i)
  73. {
  74.     return 2 * (i + 1);
  75. }
  76.  
  77.  
  78. void minHeapify(Heap* h, int i, int n, int k)
  79. {
  80.     Operation opComp1 = profiler.createOperation("k1Total", k);
  81.     Operation opComp2 = profiler.createOperation("k2Total", k);
  82.     Operation opComp3 = profiler.createOperation("k3Total", k);
  83.  
  84.     int mini = 0, ok = 0;
  85.  
  86.     int l = left(i);
  87.     int r = right(i);
  88.  
  89.     list<int>::iterator it_i = h->v.begin();
  90.     advance(it_i, i);
  91.  
  92.     if (k == 5)
  93.         opComp1.count();
  94.     else
  95.         if (k == 10)
  96.             opComp2.count();
  97.         else
  98.             if (k == 100)
  99.                 opComp3.count();
  100.     if (l < h->size)
  101.     {
  102.         list<int>::iterator it_l = h->v.begin();
  103.         advance(it_l, l);
  104.  
  105.         if (k == 5)
  106.             opComp1.count();
  107.         else
  108.             if (k == 10)
  109.                 opComp2.count();
  110.             else
  111.                 if (k == 100)
  112.                     opComp3.count();
  113.         if (l < h->size && *it_l < *it_i)
  114.         {
  115.             mini = l;
  116.             ok = 1;
  117.         }
  118.         else
  119.         {
  120.             mini = i;
  121.             ok = 1;
  122.         }
  123.     }
  124.  
  125.     list<int>::iterator it_min = h->v.begin();
  126.     advance(it_min, mini);
  127.  
  128.     if (k == 5)
  129.         opComp1.count();
  130.     else
  131.         if (k == 10)
  132.             opComp2.count();
  133.         else
  134.             if (k == 100)
  135.                 opComp3.count();
  136.     if (r < h->size)
  137.     {
  138.         list<int>::iterator it_r = h->v.begin();
  139.         advance(it_r, r);
  140.  
  141.         if (k == 5)
  142.             opComp1.count();
  143.         else
  144.             if (k == 10)
  145.                 opComp2.count();
  146.             else
  147.                 if (k == 100)
  148.                     opComp3.count();
  149.         if (r < h->size && *it_r < *it_min)
  150.         {
  151.             mini = r;
  152.             it_min = h->v.begin();
  153.             advance(it_min, mini);
  154.             ok = 1;
  155.         }
  156.     }
  157.     if (mini != i && ok)
  158.     {
  159.         if (k == 5)
  160.             opComp1.count(3);
  161.         else
  162.             if (k == 10)
  163.                 opComp2.count(3);
  164.             else
  165.                 if (k == 100)
  166.                     opComp3.count(3);
  167.         swap(*it_i, *it_min);
  168.         minHeapify(h, mini, n, k);
  169.     }
  170. }
  171.  
  172. void buildMinHeap_bottomUp(Heap* h, int n, int k)
  173. {
  174.     for (int i  = h->size / 2 - 1; i >= 0; i--)
  175.     {
  176.         minHeapify(h, i, n, k);
  177.     }
  178. }
  179.  
  180. int heapExtractMin(Heap* h, int k)
  181. {
  182.     int min = *h->v.begin();
  183.     list<int>::iterator it_ultimul = h->v.begin();
  184.     advance(it_ultimul, h->size-1);
  185.     *h->v.begin() = *it_ultimul;
  186.     h->v.pop_back();
  187.     h->size--;
  188.     minHeapify(h, 0, h->size, k);
  189.     return min;
  190. }
  191.  
  192. void interclasare_k(vector<list <int>>& lista, int k, int n)
  193. {
  194.     Operation opComp1 = profiler.createOperation("k1Total", n);
  195.     Operation opComp2 = profiler.createOperation("k2Total", n);
  196.     Operation opComp3 = profiler.createOperation("k3Total", n);
  197.  
  198.     Heap h;
  199.     h.size = k;
  200.  
  201.     int* vec = (int*)malloc(k * sizeof(int));
  202.  
  203.     int j = 0;
  204.     for (int i = 0; i < k; i++) {
  205.         if (k == 5)
  206.             opComp1.count();
  207.         else
  208.             if (k == 10)
  209.                 opComp2.count();
  210.             else
  211.                 if (k == 100)
  212.                     opComp3.count();
  213.         if (!lista[i].empty()) {
  214.             if (k == 5)
  215.                 opComp1.count();
  216.             else
  217.                 if (k == 10)
  218.                     opComp2.count();
  219.                 else
  220.                     if (k == 100)
  221.                         opComp3.count();
  222.             h.v.push_back(*lista[i].begin());
  223.             vec[i] = *lista[i].begin();
  224.             lista[i].pop_front();
  225.             j++;
  226.         }
  227.     }
  228.     //print(h.v);
  229.     h.size = j;
  230.     buildMinHeap_bottomUp(&h, h.size, k);
  231.    
  232.     while (lista_interclasta.size() < n)
  233.     {
  234.         int i = 0, c;
  235.         while(i<k) {
  236.             if (k == 5)
  237.                 opComp1.count();
  238.             else
  239.                 if (k == 10)
  240.                     opComp2.count();
  241.                 else
  242.                     if (k == 100)
  243.                         opComp3.count();
  244.             if (!h.v.empty() && h.size > 0) {
  245.                 c = heapExtractMin(&h,k);
  246.                 if (k == 5)
  247.                     opComp1.count();
  248.                 else
  249.                     if (k == 10)
  250.                         opComp2.count();
  251.                     else
  252.                         if (k == 100)
  253.                             opComp3.count();
  254.                 lista_interclasta.push_back(c);
  255.             }
  256.             int ok = 0;
  257.             for (int m = 0; ok == 0 && m < k; m++)
  258.             {
  259.                 if (k == 5)
  260.                     opComp1.count();
  261.                 else
  262.                     if (k == 10)
  263.                         opComp2.count();
  264.                     else
  265.                         if (k == 100)
  266.                             opComp3.count();
  267.                 if (vec[m] == c && !lista[m].empty())
  268.                 {
  269.                     ok = 1;
  270.                     vec[m] = *lista[m].begin();
  271.                     h.v.push_back(*lista[m].begin());
  272.                     h.size++;
  273.                     buildMinHeap_bottomUp(&h, h.size, k);
  274.                     lista[m].pop_front();
  275.                 }
  276.             }
  277.             if (!ok) {
  278.                 if (k == 5)
  279.                     opComp1.count();
  280.                 else
  281.                     if (k == 10)
  282.                         opComp2.count();
  283.                     else
  284.                         if (k == 100)
  285.                             opComp3.count();
  286.                 i = 0;
  287.                 while (i < k && lista[i].empty())
  288.                     i++;
  289.                 if (k == 5)
  290.                     opComp1.count();
  291.                 else
  292.                     if (k == 10)
  293.                         opComp2.count();
  294.                     else
  295.                         if (k == 100)
  296.                             opComp3.count();
  297.                 if (i < k && !lista[i].empty()) {
  298.                     h.v.push_back(*lista[i].begin());
  299.                     h.size++;
  300.                     buildMinHeap_bottomUp(&h, h.size, k);
  301.                     lista[i].pop_front();
  302.                 }
  303.             }
  304.             i++;
  305.         }
  306.     }
  307. }
  308.  
  309. void test_interclasare()
  310. {
  311.     vector<list <int>> lista(4);
  312.     generare_liste(lista, 8, 4);
  313.     for (int i = 0; i < 4; i++)
  314.         print(lista[i]);
  315.     interclasare_k(lista, 4,8);
  316.     print(lista_interclasta);
  317. }
  318.  
  319. void average()
  320. {
  321.     for (int n = 100; n <= 10000; n += 100)
  322.     {
  323.         //vector<list <int>> lista1(5);
  324.         //generare_liste(lista1, n, 5);
  325.         //interclasare_k(lista1, 5, n);
  326.  
  327.         //vector<list <int>> lista2(10);
  328.         //generare_liste(lista2, n, 10);
  329.         //interclasare_k(lista2, 10, n);
  330.  
  331.         vector<list <int>> lista3(100);
  332.         generare_liste(lista3, n, 100);
  333.         interclasare_k(lista3, 100, n);
  334.     }
  335.  
  336.     /*for (int k = 10; k <= 500; k += 10)
  337.     {
  338.         vector<list <int>> lista(k);
  339.         generare_liste(lista, 10000, k);
  340.         interclasare_k(lista, k, 10000);
  341.     }*/
  342.  
  343.     profiler.createGroup("Total k-const", "k1Total", "k2Total", "k3Total");
  344.     profiler.createGroup("Total n-const", "nTotal");
  345.  
  346.     profiler.showReport();
  347. }
  348.  
  349. int main()
  350. {
  351.     //test_generare();
  352.     //test_interclasare();
  353.     average();
  354. }
Advertisement
Add Comment
Please, Sign In to add comment