Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
44
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.68 KB | None | 0 0
  1. //A very simple and poorly designed hashmap implementation + AVL BST
  2. //Dedicated to flying big guanren, admin of North America Kancolle Group, who knows programming and has a lot meizi
  3. //Didn't remove test stuff in main function, ignore them
  4. //WTFPL
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <stdbool.h>
  9.  
  10. #define CALC_TIME
  11.  
  12. #ifdef CALC_TIME
  13. #include <time.h>
  14. #endif
  15.  
  16.  
  17. #define BIG_PRIME 19260817
  18. //+1s
  19.  
  20. #define MAX(a, b) (a > b ? (a) : (b))
  21.  
  22. struct treenode{
  23. long key;
  24. struct treenode * leftChild;
  25. struct treenode * rightChild;
  26. long height;
  27. //long timeAppeared;
  28. };
  29.  
  30. struct treenode * constructAVLNode(long, struct treenode*, struct treenode*);
  31. long getAVLHeight(struct treenode*);
  32. struct treenode* AVLTreeRotateLeft(struct treenode*);
  33. struct treenode* AVLTreeRotateRight(struct treenode*);
  34. int updateAVLNodeHeight(struct treenode*);
  35. struct treenode* AVLTreeAddKeyAndBalance(struct treenode*, long);
  36. bool findInAVLTree(struct treenode*, long);
  37.  
  38. unsigned long hashStr(const char[]);
  39. unsigned long hash(unsigned long);
  40. int addToHashMap(struct treenode*[], long);
  41. bool findInHashMap(struct treenode*[], long);
  42.  
  43. struct treenode *
  44. constructAVLNode(
  45. long newKey,
  46. struct treenode* lchild,
  47. struct treenode* rchild
  48. ){
  49. struct treenode * node;
  50. node = (struct treenode*)malloc(sizeof(struct treenode));
  51. if(node == NULL){
  52. return EXIT_FAILURE;
  53. }
  54. node->key = newKey;
  55. node->leftChild = lchild;
  56. node->rightChild = rchild;
  57. node->height = 0;
  58. return node;
  59. }
  60.  
  61. long getAVLHeight(struct treenode* node){
  62. if(node == NULL){
  63. return 0;
  64. }
  65. else{
  66. return node->height;
  67. }
  68. return EXIT_FAILURE;
  69. }
  70.  
  71. //Do this when right child is bigger
  72. struct treenode*
  73. AVLTreeRotateLeft(struct treenode* node){
  74. struct treenode* newnode;
  75. newnode = node -> rightChild;
  76. node -> rightChild = newnode -> leftChild;
  77. newnode -> leftChild = node;
  78. updateAVLNodeHeight(node);
  79. updateAVLNodeHeight(newnode);
  80.  
  81. return newnode;
  82. }
  83.  
  84. //Do this when left child is bigger
  85. struct treenode*
  86. AVLTreeRotateRight(struct treenode* node){
  87. struct treenode* newnode;
  88. newnode = node -> leftChild;
  89. node -> leftChild = newnode ->rightChild;
  90. newnode ->rightChild = node;
  91. updateAVLNodeHeight(node);
  92. updateAVLNodeHeight(newnode);
  93. return newnode;
  94. }
  95.  
  96. int updateAVLNodeHeight(struct treenode* node){
  97. node->height = MAX(getAVLHeight(node->leftChild),getAVLHeight(node->rightChild)) + 1;
  98. return 0;
  99. }
  100.  
  101. struct treenode* AVLTreeAddKeyAndBalance(struct treenode* node, long newkey){
  102. if(node == NULL){
  103. node = constructAVLNode(newkey, NULL, NULL);
  104. if(node == NULL){
  105. return EXIT_FAILURE;
  106. }
  107. }
  108. else if(newkey < node->key){//new key should be added to the left of the tree, in this case
  109. node->leftChild = AVLTreeAddKeyAndBalance(node -> leftChild, newkey);
  110. //left child is bigger
  111. if (getAVLHeight(node->leftChild) - getAVLHeight(node->rightChild) > 1){//Tree gets unbalanced
  112. if(newkey < node->leftChild->key){
  113. node = AVLTreeRotateRight(node);
  114. }
  115. else{
  116. node->leftChild = AVLTreeRotateLeft(node->leftChild);
  117. node = AVLTreeRotateRight(node);
  118. }
  119. }
  120. }
  121. else if(newkey > node->key){
  122. node->rightChild = AVLTreeAddKeyAndBalance(node -> rightChild, newkey);
  123. if (getAVLHeight(node->rightChild) - getAVLHeight(node->leftChild) > 1){//Tree gets unbalanced
  124. if(newkey > node->rightChild->key){
  125. node = AVLTreeRotateLeft(node);
  126. }
  127. else{
  128. node->rightChild = AVLTreeRotateRight(node->rightChild);
  129. node = AVLTreeRotateLeft(node);
  130. }
  131. }
  132. }
  133. else{
  134. return -1;
  135. //node->timeAppeared += 1;
  136. }
  137. updateAVLNodeHeight(node);
  138. return node;
  139. }
  140.  
  141. bool findInAVLTree(struct treenode* node, long newKey){
  142.  
  143. if (node == NULL) return false;
  144. if(newKey == node->key) return true;
  145.  
  146. return findInAVLTree(newKey > node->key?node->rightChild:node->leftChild, newKey);
  147. }
  148.  
  149. //Use time33 algorithm
  150. unsigned long hashStr(const char str[]){
  151. unsigned long result = 5381;
  152. while(*str != '\0'){
  153. result = (result << 5) + (*str) * 33;
  154. *str++;
  155. }
  156. return (result & 0x7FFFFFFF);
  157. }
  158.  
  159. unsigned long hash(unsigned long prehash){
  160. return prehash % BIG_PRIME;
  161. }
  162.  
  163. int addToHashMap(struct treenode* hashMap[], long key){
  164. unsigned long hashedkey = hash(key);
  165. hashMap[hashedkey] = AVLTreeAddKeyAndBalance(hashMap[hashedkey], key);
  166. return EXIT_SUCCESS;
  167. }
  168.  
  169. bool findInHashMap(struct treenode* hashMap[], long key){
  170. #ifdef CALC_TIME
  171. clock_t begin = clock();
  172. #endif
  173.  
  174. unsigned long hashedkey = hash(key);
  175.  
  176. #ifdef CALC_TIME
  177. clock_t end = clock();
  178. double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;
  179. printf("Query completed. Time consumed: %lf\n", time_spent);
  180. #endif
  181.  
  182. return findInAVLTree(hashMap[hashedkey], key);
  183. }
  184.  
  185. int main(void) {
  186. struct treenode* hashmap[BIG_PRIME + 1] = {NULL};
  187.  
  188. //long list[2000];
  189. FILE* fp;
  190. if((fp = fopen("randomdata1.txt", "r")) == NULL){
  191. return EXIT_FAILURE;
  192. }
  193. for(int i=0;i<5000;i++){
  194. long tmp;
  195. fscanf(fp,"%ld", &tmp);
  196. addToHashMap(hashmap, tmp);
  197. }
  198. bool b1, b2, b3;
  199. b1 = findInHashMap(hashmap, 780645712);//yes
  200. b2 = findInHashMap(hashmap, 35825069);//false
  201. b3 = findInHashMap(hashmap, 770721382);//yes
  202. printf("%d %d %d", b1, b2, b3);
  203.  
  204. #ifdef CALC_TIME
  205. char ch;
  206. FILE* status = fopen( "/proc/self/status", "r" );
  207. while((ch = fgetc(status)) != EOF)
  208. printf("%c", ch);
  209. #endif
  210.  
  211. return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement