Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.12 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Profiler.h"
  4. Profiler profiler("DynamicOrderStatistics");
  5. #define max_size 10000
  6.  
  7. int op_select = 0;
  8. int op_delete = 0;
  9. int op_build = 0;
  10.  
  11. typedef struct NodeT
  12. {
  13. int data;
  14. int size;
  15. struct NodeT *left, *right, *parent;
  16. } NodeT;
  17.  
  18. NodeT* initialize_node(int data)
  19. {
  20. NodeT* new_node = (NodeT*)malloc(sizeof(NodeT));
  21. op_build++;
  22. new_node->data = data;
  23. op_build++;
  24. new_node->size = 1;
  25. new_node->left = new_node->right = NULL;
  26. new_node->parent = NULL;
  27. return new_node;
  28. }
  29. NodeT* buildPBT(int a[], int first, int last) //build a PBT from an ordered array
  30. {
  31. NodeT* root = (NodeT*)malloc(sizeof(NodeT));
  32. op_build++;
  33. if (first <= last)
  34. {
  35. int mid = (first + last + 1) / 2;
  36. root = initialize_node(a[mid]);
  37. op_build = op_build + 2;
  38. root->left = buildPBT(a, first, mid - 1);
  39. root->right = buildPBT(a, mid + 1, last);
  40.  
  41. op_build++;
  42. if (root->left != NULL)
  43. {
  44. op_build++;
  45. root->size = root->size + root->left->size;
  46. }
  47. op_build++;
  48. if (root->right != NULL)
  49. {
  50. op_build++;
  51. root->size = root->size + root->right->size;
  52. }
  53.  
  54. op_build++;
  55. if (root->left != NULL)
  56. {
  57. op_build++;
  58. root->left->parent = root;
  59. }
  60. op_build++;
  61. if (root->right != NULL)
  62. {
  63. op_build++;
  64. root->right->parent = root;
  65. }
  66. return root;
  67. }
  68. else
  69. return NULL;
  70. }
  71.  
  72. void show_tree(NodeT* p, int level)
  73. {
  74. if (p != NULL)
  75. {
  76. show_tree(p->right, level + 1);
  77. for (int i = 0; i <= level; i++)
  78. printf(" ");
  79. if(p->parent == NULL)
  80. printf("%d,%d - NULL\n\n", p->data, p->size);
  81. else
  82. printf("%d,%d - %d\n\n", p->data, p->size, p->parent->data);
  83. show_tree(p->left, level + 1);
  84. }
  85. }
  86.  
  87. NodeT* OS_Select(NodeT* root, int i)
  88. {
  89. int r;
  90. op_select++;
  91. if (root != NULL)
  92. {
  93. op_select++;
  94. if (root->left != NULL)
  95. r = root->left->size + 1;
  96. else
  97. r = 1;
  98. if (i == r)
  99. return root;
  100. else
  101. {
  102. if (i < r)
  103. return OS_Select(root->left, i);
  104. else
  105. return OS_Select(root->right, i - r);
  106. }
  107. }
  108. else
  109. return NULL;
  110. }
  111.  
  112. NodeT* findMin(NodeT* pNode)
  113. {
  114. op_delete++;
  115. if (pNode == NULL)
  116. return NULL;
  117. op_delete++;
  118. if (pNode->left != NULL)
  119. return findMin(pNode->left);
  120. else
  121. return pNode;
  122.  
  123. }
  124.  
  125. void transplant(NodeT* root, NodeT* u, NodeT* v)
  126. {
  127. op_delete++;
  128. if (u->parent == NULL)
  129. {
  130. root = v;
  131. op_delete++;
  132. }
  133. else
  134. {
  135. op_delete++;
  136. if (u == u->parent->left)
  137. {
  138. u->parent->left = v;
  139. op_delete++;
  140. }
  141. else
  142. {
  143. op_delete++;
  144. u->parent->right = v;
  145. }
  146. if (v != NULL)
  147. {
  148. v->parent = u->parent;
  149. op_delete++;
  150. }
  151. }
  152. }
  153. void delete_node(NodeT* root, NodeT* z)
  154. {
  155. op_delete++;
  156. if (z->left == NULL)
  157. {
  158. // op_delete++;
  159. NodeT* aux = z;
  160. op_delete++;
  161. while (aux->parent != NULL)
  162. {
  163. op_delete++;
  164. aux->parent->size--;
  165. op_delete++;
  166. aux = aux->parent;
  167. op_delete++;
  168. }
  169. op_delete++;
  170. transplant(root, z, z->right);
  171. }
  172. else
  173. {
  174. NodeT* aux = z;
  175. op_delete++;
  176. while (aux->parent != NULL)
  177. {
  178. op_delete++;
  179. aux->parent->size--;
  180. op_delete++;
  181. aux = aux->parent;
  182. op_delete++;
  183. }
  184. op_delete++;
  185. op_delete++;
  186. if (z->right == NULL)
  187. {
  188. NodeT* aux = z;
  189. op_delete++;
  190. while (aux->parent != NULL)
  191. {
  192. op_delete++;
  193. aux->parent->size--;
  194. op_delete++;
  195. aux = aux->parent;
  196. op_delete++;
  197. }
  198. op_delete++;
  199. transplant(root, z, z->left);
  200. }
  201. else
  202. {
  203. op_delete++;
  204. NodeT* y = findMin(z->right);
  205. op_delete++;
  206. NodeT* aux = y;
  207. while (aux->parent != NULL)
  208. {
  209. op_delete++;
  210. aux->parent->size--;
  211. op_delete++;
  212. aux = aux->parent;
  213. op_delete++;
  214. }
  215. op_delete++;
  216. op_delete++;
  217. if (y->parent != z)
  218. {
  219. transplant(root, y, y->right);
  220. op_delete++;
  221. y->right = z->right;
  222. op_delete++;
  223. y->right->parent = y;
  224. }
  225. transplant(root, z, y);
  226. op_delete++;
  227. y->left = z->left;
  228. op_delete++;
  229. y->left->parent = y;
  230. op_delete++;
  231. y->size = z->size;
  232. }
  233. }
  234.  
  235. }
  236. int main()
  237. {
  238. /////////demo
  239. //NodeT* root = (NodeT*)malloc(sizeof(NodeT));
  240. //int n = 11;
  241. //int a[] = { 5, 10, 20, 27, 30, 31, 32, 35, 40, 45, 70 };
  242. //int i;
  243. //NodeT* y;
  244. ////int a[] = { 1, 2, 3, 4};
  245. ////int n = 4;
  246. //root = NULL;
  247. //root = buildPBT(a, 0, n - 1);
  248. //show_tree(root, 0);
  249. //
  250. //i = 7;//leaf 32
  251. //y = OS_Select(root, i);
  252. //if (y != NULL)
  253. // printf("I found the element %d of rank %d\n", y->data, i);
  254. //else
  255. // printf("We don't have rank %d in this tree.", i);
  256. //delete_node(root, y);
  257. //show_tree(root, 0);
  258.  
  259. //i = 5;//one child 30
  260. //y = OS_Select(root, i);
  261. //if (y != NULL)
  262. // printf("I found the element %d of rank %d\n", y->data, i);
  263. //else
  264. // printf("We don't have rank %d in this tree.", i);
  265. //delete_node(root, y);
  266. //show_tree(root, 0);
  267.  
  268. //i = 3;//two children 20
  269. //y = OS_Select(root, i);
  270. //if (y != NULL)
  271. // printf("I found the element %d of rank %d\n", y->data, i);
  272. //else
  273. // printf("We don't have rank %d in this tree.", i);
  274. //delete_node(root, y);
  275. //show_tree(root, 0);
  276.  
  277. //i = 3;//two children 31, root
  278. //y = OS_Select(root, i);
  279. //if (y != NULL)
  280. // printf("I found the element %d of rank %d\n", y->data, i);
  281. //else
  282. // printf("We don't have rank %d in this tree.", i);
  283. //delete_node(root, y);
  284. //show_tree(root, 0);
  285.  
  286. int n, a[max_size];
  287. for (n = 100; n <= 10000; n += 100)
  288. {
  289.  
  290. op_select = 0;
  291. op_delete = 0;
  292. op_build = 0;
  293. NodeT* root = NULL;
  294. FillRandomArray(a, n, 0, 10000, 1);
  295. root = buildPBT(a, 0, n - 1);
  296. srand(time(NULL));
  297. int n_ramase = n;
  298. for (int i = 0; i < n; i++)
  299. {
  300. int ith_smallest = rand() % (n_ramase);
  301. NodeT* val = OS_Select(root, ith_smallest);
  302. if (val != NULL)
  303. delete_node(root, val);
  304. n_ramase--;
  305. }
  306.  
  307. profiler.countOperation("op_select", n, op_select);
  308. profiler.countOperation("op_delete", n, op_delete);
  309. profiler.countOperation("op_build", n, op_build);
  310. profiler.countOperation("Operations", n, op_select + op_delete + op_build);
  311.  
  312. profiler.createGroup("Operations", "op_select", "op_delete", "op_build");
  313. }
  314. profiler.showReport();
  315. return 0;
  316. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement