Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.32 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "Profiler.h"
  4. #include <string.h>
  5. #define n 10007
  6. #define none 0
  7.  
  8. #ifdef _DEBUG
  9. #define LOG(...) printf(__VA_ARGS__)
  10. #define IS_DEBUG true
  11. #else
  12. #define LOG(...)
  13. #define IS_DEBUG false
  14. #endif
  15.  
  16. Profiler profiler("HashTable");
  17.  
  18. int searchEffort;
  19. int percent[5] = { 80, 85, 90, 95, 99 };
  20.  
  21. typedef struct
  22. {
  23. int id;
  24. char name[30];
  25. } NodeT;
  26.  
  27. int hashFct(int k,int i,int size)
  28. {
  29. return (k+5*i+11*i*i) % size;
  30. }
  31.  
  32. int fillFactor(int percent,int size)
  33. {
  34. int x = (percent * size) / 100;
  35. return x;
  36. }
  37.  
  38. void hashReset(NodeT* T, int size)
  39. {
  40. for (int i = 0; i < size; i++)
  41. {
  42. T[i].id = none;
  43. strcpy_s(T[i].name, "empty");
  44. }
  45. }
  46.  
  47. int hashInsert(NodeT* T,int size,int key)
  48. {
  49. int i = 0;
  50. do
  51. {
  52. int j = hashFct(key, i,size);
  53. if (T[j].id == none)
  54. {
  55. T[j].id = key;
  56. strcpy_s(T[j].name,"Element");
  57. if(IS_DEBUG) printf("The element %d is insered on position %d\n", key,j);
  58. return j;
  59. }
  60. else i++;
  61.  
  62. } while (i != size);
  63. if (IS_DEBUG) printf("Error: full table");
  64. }
  65.  
  66.  
  67. int hashSearch(NodeT* T, int size, int key)
  68. {
  69. int i = 0,j;
  70. searchEffort = 0;
  71. do
  72. {
  73. j = hashFct(key, i,size);
  74. searchEffort++;
  75. if (T[j].id == key)
  76. {
  77.  
  78. if (IS_DEBUG) printf("The element %d was found on position %d\n", key, j);
  79. return j;
  80.  
  81. }
  82. i++;
  83.  
  84. } while (T[i].id != none && i != size);
  85.  
  86. if (IS_DEBUG) printf("Error: element %d not found\n",key);
  87. return 0;
  88.  
  89.  
  90. }
  91.  
  92. void printHash(NodeT* T, int size)
  93. {
  94. for (int i = 0; i < size; i++)
  95. {
  96. printf("%d %s\n", T[i].id,T[i].name);
  97. }
  98. }
  99.  
  100. void demoHash()
  101. {
  102. printf("-------------operation verify--------------\n");
  103. printf("------------------insertion----------------\n");
  104. NodeT* T = (NodeT*)malloc(11 * sizeof(NodeT));
  105. hashReset(T, 11);
  106. hashInsert(T, 11, 23);
  107. hashInsert(T, 11, 2);
  108. hashInsert(T, 11, 55);
  109. hashInsert(T, 11, 6);
  110. hashInsert(T, 11, 21);
  111. hashInsert(T, 11, 15);
  112. hashInsert(T, 11, 5);
  113. hashInsert(T, 11, 11);
  114. hashInsert(T, 11, 12);
  115. hashInsert(T, 11, 18);
  116. printf("\nThe content of the table is:\n");
  117. printHash(T, 11);
  118. printf("\n----------------searching----------------\n");
  119. hashSearch(T, 11, 23);
  120. hashSearch(T, 11, 3);
  121. hashSearch(T, 11, 55);
  122. hashSearch(T, 11, 7);
  123. printf("\n");
  124. }
  125.  
  126. void demoFill95()
  127. {
  128. int maxEffortFound = 0, maxEffortNotFound = 0;
  129. int totalEffortFound = 0, totalEffortNotFound = 0;
  130. printf("-------------search evaluation for 0.95 fill factor--------------\n");
  131. NodeT* T = (NodeT*)malloc(n * sizeof(NodeT));
  132. hashReset(T, n);
  133. int* a = (int*)malloc(n * sizeof(int));
  134. FillRandomArray(a, n , 1, 20000 , false, 0);
  135. for (int i = 0; i < fillFactor(95, n); i++)
  136. {
  137. hashInsert(T, n, a[i]);
  138. }
  139.  
  140. for (int i = 0; i < 1500; i++)
  141. {
  142. hashSearch(T, n, a[i]);
  143. if (searchEffort > maxEffortFound) maxEffortFound= searchEffort;
  144. totalEffortFound += searchEffort;
  145. printf("%d ", searchEffort);
  146.  
  147.  
  148. }
  149. int j = 20001;
  150. for (int i = 0; i < 1500; i++)
  151. {
  152.  
  153. hashSearch(T, n, j);
  154. j ++;
  155. if (searchEffort > maxEffortNotFound) maxEffortNotFound = searchEffort;
  156. totalEffortNotFound += searchEffort;
  157. }
  158. printf("%d", totalEffortNotFound);
  159. double x = (double)totalEffortFound / 1500;
  160. double y = (double)totalEffortNotFound / 1500;
  161. printf("\nFillFactor | Avg. Effort(found) | Max Effort(found) | Avg. Effort(not found) | Max Effort(not found) |\n");
  162. printf("-------------------------------------------------------------------------------------------------------------------------------------------------\n");
  163. printf(" 95 | %0.2lf | %d | %0.2lf | %d |\n",x,maxEffortFound,y,maxEffortNotFound);
  164.  
  165.  
  166. }
  167.  
  168. void table()
  169. {
  170. printf("\n\n\nFillingFactor\t\tAvgEffortFound\t\tMaxEffortFound\t\tAvgEffortNotFound\t\tMaxEffortNotFound");
  171. printf("\n");
  172. int i, j;
  173. NodeT* T = (NodeT*)malloc(n * sizeof(NodeT));
  174.  
  175. for (i = 0; i < 5; i++)
  176. {
  177.  
  178. double avgFound = 0;
  179. double maxFound = 0;
  180. double avgNotFound = 0;
  181. double maxNotFound = 0;
  182.  
  183. for (j = 0; j < 5; j++)
  184. {
  185. int a[n];
  186. int indexArray[1500];
  187. FillRandomArray(a, n, 1, 20000);
  188. FillRandomArray(indexArray,1500, 1, n);
  189.  
  190. hashReset(T, n);
  191.  
  192. int k;
  193. for (k = 0; k < fillFactor(i, n); k++)
  194. {
  195. hashInsert(T, n, a[k]);
  196. }
  197.  
  198. int k1;
  199. int maxEffortFound = 0;
  200. double AvgSearchF = 0;
  201.  
  202. for (k1 = 0; k1 < 1500; k1++)
  203. {
  204. searchEffort = 0;
  205. hashSearch(T,n,a[indexArray[k]]);
  206. if (searchEffort > maxEffortFound) maxEffortFound = searchEffort;
  207. AvgSearchF = AvgSearchF + searchEffort;
  208. }
  209. AvgSearchF /= 1500.0;
  210.  
  211.  
  212. avgFound += AvgSearchF;
  213. maxFound += (double)maxEffortFound;
  214.  
  215.  
  216. int k2;
  217. int elem = 20001;
  218. int maxEffortNotFound = 0;
  219. double AvgSearchNF = 0;
  220. for (k2 = 0; k2 < 1500; k2++)
  221. {
  222. searchEffort = 0;
  223. int found2 = hashSearch(T,n,elem);
  224. elem += 500;
  225.  
  226. if (searchEffort > maxEffortNotFound) maxEffortNotFound = searchEffort;
  227. AvgSearchNF = AvgSearchNF + searchEffort;
  228. }
  229. AvgSearchNF /= 1500.0;
  230.  
  231. avgNotFound += AvgSearchNF;
  232. maxNotFound += maxEffortNotFound;
  233. }
  234.  
  235.  
  236. printf("%d\t\t%0.3lf\t\t%0.3lf\t\t\t%0.3lf\t\t\t%0.3lf\n", percent[i], avgFound / 5, maxFound / 5, avgNotFound / 5, maxNotFound / 5);
  237.  
  238. }
  239. }
  240.  
  241.  
  242.  
  243. int main()
  244. {
  245. if (IS_DEBUG)
  246. {
  247. demoHash();
  248.  
  249. }
  250. else
  251. {
  252. //demoFill95();
  253. table();
  254. }
  255. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement