Advertisement
Guest User

Untitled

a guest
May 26th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.16 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4.  
  5. class HashTable
  6. {
  7. public:
  8. HashTable(std::vector<int>& firstArray, std::vector<int>& secondArray)
  9. {
  10. if(firstArray.size() > secondArray.size())
  11. {
  12. swap(firstArray, secondArray);
  13. }
  14. mTableSize = firstArray.size();
  15. arrayWithNumbersForCheck = secondArray;
  16. for(size_t i = 0; i < mTableSize; ++i)
  17. {
  18. mHashTable.emplace_back();
  19. }
  20.  
  21. for(size_t i = 0; i < mTableSize; ++i)
  22. {
  23. mHashTable[hashFunction(firstArray[i])].push_back(firstArray[i]);
  24. }
  25. }
  26.  
  27. size_t numberOfCommonElement()
  28. {
  29. if(mTableSize == 0)
  30. {
  31. return 0;
  32. }
  33. size_t result = 0;
  34. for(int i : arrayWithNumbersForCheck)
  35. {
  36. if(contains(i))
  37. {
  38. ++result;
  39. }
  40. }
  41. return result;
  42. }
  43.  
  44. private:
  45. std::vector<std::vector<int>> mHashTable;
  46. std::vector<int> arrayWithNumbersForCheck;
  47. size_t mTableSize;
  48.  
  49. size_t hashFunction(const int element)
  50. {
  51. return ((9999830011 * element + 4798669) % 97643212667) % mTableSize;
  52. }
  53.  
  54. bool contains(const int element)
  55. {
  56. size_t indexInTable = hashFunction(element);
  57. bool tableContainsElement = false;
  58. if(indexInTable < mTableSize)
  59. {
  60. for (int i : mHashTable[indexInTable])
  61. {
  62. if (i == element) {
  63. tableContainsElement = true;
  64. break;
  65. }
  66. }
  67. }
  68. return tableContainsElement;
  69. }
  70. };
  71.  
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. size_t numberOfCommonElement(std::vector<int>& firstArray, std::vector<int>& secondArray)
  74. {
  75. size_t result = 0;
  76.  
  77. if(firstArray.empty() || secondArray.empty())
  78. {
  79. return 0;
  80. }
  81. if(firstArray.size() > secondArray.size())
  82. {
  83. swap(firstArray, secondArray);
  84. }
  85.  
  86. sort(firstArray.begin(), firstArray.end());
  87.  
  88. size_t left;
  89. size_t right;
  90. size_t middle;
  91.  
  92. //binary search
  93. for(int i : secondArray)
  94. {
  95. left = -1;
  96. right = firstArray.size();
  97. while(left + 1 < right)
  98. {
  99. middle = (left + right) / 2;
  100. if(firstArray[middle] == i)
  101. {
  102. break;
  103. }
  104. if(firstArray[middle] < i)
  105. {
  106. left = middle;
  107. }
  108. else
  109. {
  110. right = middle;
  111. }
  112. }
  113. if(firstArray[middle] == i)
  114. {
  115. ++result;
  116. }
  117. }
  118. return result;
  119. }
  120. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  121. void testOne()
  122. {
  123. std::vector<int> firstArray;
  124. std::vector<int> secondArray;
  125. std::set<int> set;
  126. for(int i = 0; i < 5000000; ++i)
  127. {
  128. set.insert(rand() % 6000000);
  129. }
  130. for(int i : set)
  131. {
  132. firstArray.push_back(i);
  133. secondArray.push_back(i);
  134. }
  135. firstArray.push_back(-2);
  136. secondArray.push_back(-1);
  137. HashTable table(firstArray, secondArray);
  138. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  139. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  140. "Correct answer in test one" : "Incorrect answer in test one") << std::endl;
  141. }
  142. void testTwo()
  143. {
  144. std::vector<int> firstArray;
  145. std::vector<int> secondArray;
  146. for(int i = 0; i < 100000; ++i)
  147. {
  148. firstArray.push_back(i * 2 + (rand() % 10000));
  149. secondArray.push_back(i * 2 + (rand() % 10000));
  150. }
  151. HashTable table(firstArray, secondArray);
  152. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  153. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  154. "Correct answer in test two" : "Incorrect answer in test two") << std::endl;
  155. }
  156.  
  157. void testThree()
  158. {
  159. std::vector<int> firstArray;
  160. std::vector<int> secondArray;
  161. for(int i = 0; i < 100000; ++i)
  162. {
  163. firstArray.push_back(rand());
  164. }
  165. HashTable table(firstArray, secondArray);
  166. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  167. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  168. "Correct answer in test three" : "Incorrect answer in test three") << std::endl;
  169. }
  170.  
  171. void testFour()
  172. {
  173. std::vector<int> firstArray;
  174. std::vector<int> secondArray;
  175. firstArray = {2123123123};
  176. secondArray = {0, 1, 2123123122, 3, 9, 2123123123, 7, 6, 5, 2123123121};
  177. HashTable table(firstArray, secondArray);
  178. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  179. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  180. "Correct answer in test four" : "Incorrect answer in test four") << std::endl;
  181. }
  182. void testFive()
  183. {
  184. std::vector<int> firstArray;
  185. std::vector<int> secondArray;
  186. firstArray = {2123123123, -123123123};
  187. secondArray = {0, 1, 2123123121, 3, 9, 2123123123, 7, -123123122, -123123124, -123123123};
  188. HashTable table(firstArray, secondArray);
  189. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  190. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  191. "Correct answer in test five" : "Incorrect answer in test five") << std::endl;
  192. }
  193. void testSix()
  194. {
  195. std::vector<int> firstArray;
  196. std::vector<int> secondArray;
  197. firstArray = {1, 2, 3};
  198. secondArray = {0, 3, 6, 9, 1, 4, 7, 2, 5, 8};
  199. HashTable table(firstArray, secondArray);
  200. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  201. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  202. "Correct answer in test six" : "Incorrect answer in test six") << std::endl;
  203. }
  204. void testSeven()
  205. {
  206. std::vector<int> firstArray;
  207. std::set<int> firstSet;
  208. std::vector<int> secondArray;
  209. std::set<int> secondSet;
  210. size_t firstRandomSize = rand() % 5000000;
  211. size_t secondRandomSize = rand() % 5000000;
  212. for(size_t i = 0; i < firstRandomSize; ++i)
  213. {
  214. firstSet.insert(rand() % 500000); //use the set to fill the array with various numbers
  215. }
  216. for(int element : firstSet)
  217. {
  218. firstArray.push_back(element);
  219. }
  220. for(size_t i = 0; i < secondRandomSize; ++i)
  221. {
  222. secondSet.insert(rand() % 500000); //use the set to fill the array with various numbers
  223. }
  224. for(int element : firstSet)
  225. {
  226. secondArray.push_back(element);
  227. }
  228.  
  229. HashTable table(firstArray, secondArray);
  230. size_t correctAnswer = numberOfCommonElement(firstArray, secondArray);
  231. std::cout << (table.numberOfCommonElement() == correctAnswer ?
  232. "Correct answer in test seven" : "Incorrect answer in test seven") << std::endl;
  233. }
  234.  
  235. int main()
  236. {
  237. testOne();
  238. testTwo();
  239. testThree();
  240. testFour();
  241. testFive();
  242. testSix();
  243. testSeven();
  244. return 0;
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement