Advertisement
Guest User

Untitled

a guest
Dec 5th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.35 KB | None | 0 0
  1. #include <iostream>
  2. #include <time.h>
  3. #include <exception>
  4. #include <random>
  5. #include <string>
  6. template <typename T>
  7. struct node {
  8. node() {};
  9. node(T value) : data(value) {}
  10. T data;
  11. };
  12.  
  13. template <typename T>
  14. struct kopiec {
  15. long int size = 0;
  16. long int capacity = 1;
  17. node<T>* table = new node<T>[capacity];
  18. kopiec() {
  19.  
  20. }
  21. kopiec(T* tablica, int rozmiar) {
  22. size = rozmiar;
  23. for (int i = 0; i <= size; i++) {
  24. table[i] = *(tablica + i);
  25. }
  26. przekopcowanieRekWDol(0);
  27. }
  28. ~kopiec() {
  29. delete[] table;
  30. }
  31. int leftChild(int indeks) {
  32. int left = 2 * indeks;
  33. if (left <= size && left >= 0) {
  34. return left;
  35. }
  36. else {
  37. return -1;
  38. }
  39. }
  40. int rightChild(int indeks) {
  41. int right = 2 * indeks + 1;
  42. if (right <= size && right >= 0) {
  43. return right;
  44. }
  45. else {
  46. return -1;
  47. }
  48. }
  49. int parent(int indeks) {
  50. if (indeks > 0) {
  51. int rodzic = (indeks - 1) / 2;
  52. if (rodzic <= size && rodzic >= 0) {
  53. return rodzic;
  54. }
  55. else {
  56. return -1;
  57. }
  58. }
  59. else {
  60. return -1;
  61. }
  62. }
  63. T getAndDeleteMax() {
  64. T chwilowy = table[0].data;
  65.  
  66. size--;
  67. table[0] = table[size];
  68.  
  69. //przesunięcie tablicy o 1 w lewo
  70. /*for (int i = 0; i < size; i++) {
  71. table[i].data = table[i + 1].data;
  72. }
  73.  
  74. if (table[0].data < table[1].data) {
  75. T chwilowyII = table[0].data;
  76. table[0].data = table[1].data;
  77. table[1] = chwilowyII;
  78. }
  79. if (table[0].data < table[2].data) {
  80. T chwilowyII = table[0].data;
  81. table[0].data = table[2].data;
  82. table[2] = chwilowyII;
  83. }*/
  84. przekopcowanieRekWDol(0);
  85.  
  86. return chwilowy;
  87. }
  88. void addNewNode(node<T> newData) {
  89. if (size < capacity) {
  90. table[size] = node<T>{ newData };
  91. size++;
  92. }
  93. else {
  94. capacity = capacity * 2;
  95. node<T>* biggerTable = new node<T>[capacity];
  96. for (int i = 0; i < size; i++) {
  97. biggerTable[i] = table[i];
  98. }
  99. delete[] table;
  100. table = biggerTable;
  101. table[size] = node<T>{ newData };
  102. size++;
  103. }
  104. if (size > 1) {
  105. przekopcowanieRekWGore(size - 1);
  106. }
  107. }
  108. void deleteAll() {
  109. delete[] table;
  110. }
  111. void showAll() {
  112. for (int i = 0; i < size; i++) {
  113. std::cout << table[i];
  114. }
  115. }
  116. void przekopcowanieRekWGore(int indeks) {
  117. auto rodzic = parent(indeks);
  118. if (rodzic >= 0) {
  119. T chwilowy = table[rodzic].data;
  120. if (indeks > 0 && chwilowy < table[indeks].data)
  121. {
  122. table[rodzic].data = table[indeks].data;
  123. table[indeks].data = chwilowy;
  124. przekopcowanieRekWGore(rodzic);
  125. }
  126. }
  127. else {
  128. //std::cout << "przekopcowaniewgore nie tak" << std::endl;
  129. }
  130. }
  131. void przekopcowanieRekWDol(int indeks) {
  132. int largest = indeks;
  133. int left = leftChild(indeks);
  134. int right = rightChild(indeks);
  135.  
  136. if (left > 0 && table[left].data > table[largest].data) {
  137. largest = left;
  138. }
  139. else if (right > 0 && table[right].data > table[largest].data) {
  140. largest = right;
  141. }
  142. if (largest != indeks) {
  143. node<T> chwilowy;
  144. chwilowy.data = table[indeks].data;
  145. table[indeks].data = table[largest].data;
  146. table[largest] = chwilowy;
  147. //std::cout << indeks << std::endl;
  148. przekopcowanieRekWDol(largest);
  149. }
  150. }
  151. };
  152.  
  153. template <typename T>
  154. std::ostream& operator<<(std::ostream& out, const node<T>& val) {
  155. out << val.data << std::endl;
  156. return out;
  157. }
  158.  
  159. int main() {
  160. std::random_device rd;
  161. std::mt19937 gen(rd());
  162. std::uniform_int_distribution<int> losowa(1, 10000);
  163. const int MAX_ORDER = 1; // maksymalny rzad wielkosci dodawanych danych
  164.  
  165. double time1 = 0;
  166. double time2 = 0;
  167.  
  168.  
  169. for (int o = 1; o <= MAX_ORDER; o++)
  170. {
  171. int n = 0;
  172. kopiec <int> example; // stworzenie kopca
  173. clock_t t1 = clock();
  174. //dodawanie do kopca
  175. for (int i = pow(10, o); i > 0; i--)
  176. {
  177. int liczba = losowa(gen);
  178. example.addNewNode(i);
  179.  
  180. n++;
  181. }
  182. clock_t t2 = clock();
  183.  
  184. std::cout << std::endl;
  185. time1 = (t2 - t1) / (double)CLOCKS_PER_SEC;
  186. //pobieranie i usuwanie elemntu maksymalnego kopca
  187. clock_t t3 = clock();
  188. for (int i = 0; i < n; i++) {
  189. auto cos = example.getAndDeleteMax();
  190. example.showAll();
  191. std::cout << std::endl;
  192. }
  193. clock_t t4 = clock();
  194. time2 = (t4 - t3) / (double)CLOCKS_PER_SEC;
  195.  
  196. std::cout << "Czas dodawania " << n << " elemenow: " << time1 << std::endl;
  197. std::cout << "Czas pobierania i kasowania maxow: " << time2 << std::endl;
  198. }
  199. std::cout << "koniec" << std::endl;
  200. getchar();
  201. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement