Advertisement
Guest User

Untitled

a guest
Nov 11th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.21 KB | None | 0 0
  1. #include <iostream>
  2. #include "Profiler.h"
  3. #define totalPos 10007
  4.  
  5. using namespace std;
  6.  
  7. float fillingFactor[] = { 0.8, 0.85, 0.9, 0.95, 0.99 };
  8. int maxEffortFound[5], maxEffortNotFound[5];
  9. float avgEffortFound[5], avgEffortNotFound[5];
  10. int effort = 0;
  11.  
  12. typedef struct {
  13. int id;
  14. //char name[30];
  15. } Entry;
  16.  
  17.  
  18. int hLinear(int val) {
  19. return val % totalPos;
  20. }
  21.  
  22. int hQuadric(int val, int i, int totalPosi) {
  23. return (val + 7*i + i * i) % totalPosi;
  24. }
  25.  
  26. void createEmptyHash(Entry table[], int size) {
  27. for (int i = 0; i < size; i++) {
  28. table[i].id = NULL;
  29. }
  30. }
  31.  
  32. int hashInsert(Entry table[], int value, int size) {
  33. int i = 0;
  34. do {
  35. int j = hQuadric(value, i, size);
  36. if (table[j].id == NULL) {
  37. table[j].id = value;
  38. return j;
  39. }
  40. else i++;
  41. } while (i < size);
  42. cout << "Error: Hash Table overflow\n";
  43. return 0;
  44. }
  45.  
  46. int hashSearch(Entry table[], int value, int size) {
  47. int i = 0, j;
  48. do {
  49. j = hQuadric(value, i, size);
  50. effort++;
  51. if (table[j].id == value) {
  52. //cout << table[j].name << " ";
  53. return j;
  54. }
  55. i++;
  56. } while (table[j].id != NULL && i < size);
  57. return NULL;
  58. }
  59.  
  60. void singleFillFactor() {
  61. Entry table[totalPos];
  62. createEmptyHash(table, totalPos);
  63. int insVector[totalPos], nfVector[1505];
  64. FillRandomArray(nfVector, 1500, 11000, 15000, true, 0);
  65. FillRandomArray(insVector, int(0.95 * totalPos), 0, 10500, true, 0);
  66. /* We choose .95 as the fill factor for this case */
  67. for (int i = 0; i < int(0.95 * totalPos); i++)
  68. hashInsert(table, insVector[i], totalPos);
  69. for (int i = 0; i < 1500; i++) {
  70. effort = 0;
  71. int aux;
  72. aux = hashSearch(table, nfVector[i], totalPos);
  73. if (effort > maxEffortNotFound[3])
  74. maxEffortNotFound[3] = effort;
  75. avgEffortNotFound[3] += effort;
  76.  
  77. effort = 0;
  78. aux = hashSearch(table, table[i].id, totalPos);
  79. if (aux != NULL) {
  80. if (effort > maxEffortFound[3])
  81. maxEffortFound[3] = effort;
  82. avgEffortFound[3] += effort;
  83. }
  84. }
  85. avgEffortFound[3] = avgEffortFound[3] / 1500;
  86. avgEffortNotFound[3] = avgEffortNotFound[3] / 1500;
  87. cout << "\nFor the fill factor .95, with non-uniform selection of elements, we have: \n";
  88. cout << "Avg effort found: " << avgEffortFound[3];
  89. cout << "\nMax effort found: " << maxEffortFound[3];
  90. cout << "\nAvg effort not found: " << avgEffortNotFound[3];
  91. cout << "\nMax Effort not found: " << maxEffortNotFound[3] << "\n\n\n";
  92. }
  93.  
  94. void allFillFactors() {
  95. cout << "For all fill factors with uniform selection, we have:\n";
  96. cout << "Filling Factort\t\t" << "Avg Effort Found\t" << "Max Effort Found\t" << "Avg Effort Not Found\t" << "Max Effort Not Found\n";
  97. for (int factor = 0; factor < 5; factor++) {
  98. float x_factor = fillingFactor[factor];
  99. Entry table[totalPos];
  100. createEmptyHash(table, totalPos);
  101. int insVector[totalPos], nfVector[1505];
  102. FillRandomArray(nfVector, 1500, 11000, 15000, true, 0);
  103. FillRandomArray(insVector, int(x_factor * totalPos), 0, 10500, true, 0);
  104. for (int i = 0; i < int(x_factor * totalPos); i++)
  105. hashInsert(table, insVector[i], totalPos);
  106. for (int i = 0; i < 1500; i++) {
  107. effort = 0;
  108. int aux;
  109. aux = hashSearch(table, nfVector[i], totalPos);
  110. if (effort > maxEffortNotFound[factor])
  111. maxEffortNotFound[factor] = effort;
  112. avgEffortNotFound[factor] += effort;
  113.  
  114. effort = 0;
  115. aux = hashSearch(table, table[i * 6].id, totalPos);
  116. if (aux != NULL) {
  117. if (effort > maxEffortFound[factor])
  118. maxEffortFound[factor] = effort;
  119. avgEffortFound[factor] += effort;
  120. }
  121. }
  122. avgEffortFound[factor] = avgEffortFound[factor] / 1500;
  123. avgEffortNotFound[factor] = avgEffortNotFound[factor] / 1500;
  124. cout << x_factor << "\t\t\t" << avgEffortFound[factor] << "\t\t\t" << maxEffortFound[factor] << "\t\t\t" << avgEffortNotFound[factor] << "\t\t\t" << maxEffortNotFound[factor] <<"\n";
  125. }
  126. }
  127.  
  128. void insertDemo() {
  129. cout << "INSERTION DEMO\n\n";
  130. int v[] = { 1, 2, 3, 4, 55, 66, 77, 44, 33, 6, 9};
  131. Entry table[11];
  132. createEmptyHash(table, 11);
  133. cout << "The vector we add in the hash table: ";
  134. for (int i = 0; i < 11; i++)
  135. cout << v[i] << " ";
  136. cout << "\nThe initial Hash Table: ";
  137. for (int i = 0; i < 11; i++)
  138. cout << table[i].id << " ";
  139. for (int i = 0; i < 11; i++)
  140. hashInsert(table, v[i], 11);
  141. cout << "\nAfter the insertion, we have:\n";
  142. for (int i = 0; i < 11; i++)
  143. cout <<"On the position " <<i <<": " <<table[i].id <<"\n";
  144. }
  145.  
  146. void searchDemo() {
  147. cout << "\n\nSEARCH DEMO\n\n";
  148. int v[] = { 1, 2, 3, 4, 5, 6};
  149. int tested[] = { 1, 3, 5, 7, 8, 9 };
  150. Entry table[10];
  151. createEmptyHash(table, 10);
  152. for (int i = 0; i < 6; i++)
  153. hashInsert(table, v[i], 10);
  154. cout << "The array we search for is: ";
  155. for (int i = 0; i < 6; i++)
  156. cout << tested[i] << " ";
  157. cout << "\nThe Hash Table is: ";
  158. for (int i = 0; i < 10; i++)
  159. cout << table[i].id << " ";
  160. cout << "\n";
  161. for (int i = 0; i < 6; i++) {
  162. int ok;
  163. ok = hashSearch(table, tested[i], 10);
  164. if (ok == NULL) cout << "The element " << tested[i] << " is not in the table\n";
  165. else cout << "The element " << tested[i] << " is in the table\n";
  166. }
  167. }
  168.  
  169.  
  170. int main()
  171. {
  172. insertDemo();
  173. searchDemo();
  174. singleFillFactor();
  175. allFillFactors();
  176.  
  177. /*for (int i = 0; i < 5; i++)
  178. cout << fillingFactor[i] << " "; */
  179. return 0;
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement