Advertisement
Guest User

Untitled

a guest
Nov 13th, 2015
33
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <assert.h>
  2. #include <stdlib.h>
  3. #include <stddef.h>
  4. #include <stdio.h>
  5. #include "HashTableOpen.h"
  6. #include <iostream>
  7. #include <string>
  8.  
  9. //while the other method provides better next slot access, an array provides better speed since it will save a ton
  10. //of recursive nexts when going to a position deeper into the table. also since the array is always gonna be [size]
  11. //no worry about array resizing.E
  12.  
  13. int full = 999;
  14.  
  15. std::string* HashTableOpen_construct(int size) {
  16.     std::string *HashtableOpen; //make pointer
  17.     HashtableOpen = new std::string[size];  // new creates a array of size [size] and assigns the pointer for it to HashtableOpen
  18.                                             //  HashtableOpen[size] = { NULL };                             //???? \nprofit
  19.     memset(HashtableOpen, NULL, size);
  20.     if (HashtableOpen == nullptr) {
  21.         printf("Failed to create array.");
  22.         exit(EXIT_FAILURE);
  23.     }
  24.     else
  25.         printf("HashtableOpen created sucessfully.");
  26.     return HashtableOpen;
  27.     //using std::cout; to print
  28.     //HashtableOpen[5] = 'chat';
  29. }
  30.  
  31. bool HashTableOpen_insert(std::string *HashtableOpen, std::string item, int size) {
  32.     int h = tinyhash(item);
  33.     std::cout << '\n' << item << ' ' << (tinyhash(item)) << " h: " << h ;
  34.  
  35.     //if (HashtableOpen[h] != NULL){;
  36.     if (!HashtableOpen[h].empty()) {;
  37.         std::cout << "\nNotify: table here at " << h <<" is already matched";
  38.         int slot = findslot(HashtableOpen, size, h);
  39.         if (slot != full) {
  40.             HashtableOpen[slot] = h;
  41.             return true; //sucess
  42.         }
  43.         if (slot == full) {
  44.             return false; //failure
  45.         }
  46.  
  47.     }
  48.     else {
  49.         HashtableOpen[h] = h;
  50.         return true;
  51.     }
  52. }
  53.  
  54. int findslot(std::string *HashtableOpen, int size, int h) { //uses the next open slot
  55.     int hO = h; //orignal location
  56.     int nslot;
  57.     printf("\nDebug: finding slot");
  58.     if ((h + 1) > size) { //end ot table
  59.         nslot = overrun(HashtableOpen, hO);
  60.     }
  61.     if (h + 1 <= size) {
  62.         printf("\n D-F1");
  63.         while (h + 1 < size & !HashtableOpen[h + 1].empty()) {
  64.             printf("Notify: table here already matched");
  65.             h += 1;
  66.         }
  67.         if (h + 1 < size & HashtableOpen[h + 1].empty()) {
  68.             printf("\n D-F2 ");
  69.             std::cout << h;
  70.             nslot = h + 1;
  71.             printf("\n D-F2-2 ");
  72.             printf("Notify: new slot is %i", nslot);
  73.             printf("\n D-F2-3");
  74.             return nslot;
  75.         }
  76.         else {//h+1 > size:
  77.             printf("\n D-F3");
  78.             nslot = overrun(HashtableOpen, hO);
  79.             return nslot;
  80.         }
  81.     }
  82.     else {
  83.         printf("\n D-F4");
  84.         nslot = overrun(HashtableOpen, hO);
  85.         return nslot;
  86.     printf("\n D-F5");
  87.     }
  88.     printf("\n D_F6");
  89. }
  90.  
  91. int overrun(std::string *HashtableOpen, int hO) { //table overrun
  92.     int n = 0;
  93.     int h = -1; //loop back to check the start
  94.     printf("\nDebug: overrun");
  95.  
  96.     while (!HashtableOpen[h + 1].empty() & h<hO) {
  97.         printf("Debug: Looping back h= ", h);
  98.         printf("Notify: table here already matched");
  99.         h += 1;
  100.     }
  101.     if (HashtableOpen[h + 1].empty() & h<hO) {
  102.         int nslot = h + 1;
  103.         printf("Notify: new slot is %s") % nslot;
  104.         return nslot;
  105.     }
  106.  
  107.     if (h >= hO) {
  108.         printf("Notify: table full!\n");
  109.         return full;
  110.     }
  111.  
  112. }
  113.  
  114.  
  115. void HashTableOpen_destroy(std::string *HashtableOpen, int size) {
  116.     //memset(HashtableOpen, NULL, size);
  117.     delete[] HashtableOpen;
  118.     printf("\nDestroy\n");
  119. }
  120.  
  121. /*
  122. int hashtable_lookup(std::string *HashtableOpen, int size, std::string item) {
  123. int ih = 0; //index table
  124. std::string results;
  125. int match = tinyhash(item); //since this is a destructive hash we need to hash the item to know what to look for
  126. while (ih < size) {
  127. if (HashtableOpen[ih] == match) {
  128. results = results + str(ih) + ' ';
  129. ih += 1;
  130. }
  131. else {
  132. ih += 1;
  133. }
  134. }
  135. return results;
  136. }
  137. */
  138. int tinyhash(std::string item) {
  139.     return item.length();
  140. }
  141.  
  142.  
  143. /*working code in python I made to understand the assignment because it takes 10x less time to see if things are gonna work as
  144. intended using python.
  145.  
  146. #stuff to make it more c like
  147. hashtable=['']*10
  148. NULL=''  #mimics NULL being a empty string
  149. equals='equals'
  150. hashfunction="length of input"
  151.  
  152.  
  153. def hashtable_construct(size, hashtable, hashfunction, equals):
  154. hashtable=['']*size #void HashTableOpen_construct(ect)
  155. tablelen=len(hashtable)
  156.  
  157. def openinsbuild_table(hashtable):
  158. while 1==1:
  159. item = raw_input("Enter value: ")
  160. if item=="exit":
  161. return
  162. else:
  163. h=tinyhash(item)
  164. if hashtable[h]!=NULL:
  165. print 'Notify: table here at %s is already matched' % h
  166. slot=findslot(hashtable,tablelen,h)
  167. if slot!= 'full':
  168. print 'slot %s' % slot
  169. hashtable[slot]=h
  170. else:
  171. hashtable[h]=h
  172.  
  173. def hashtable_insert(hashtable,item):
  174. h=tinyhash(item)
  175. if hashtable[h]!=NULL:
  176. print 'Notify: table here at %s is already matched' % h
  177. slot=findslot(hashtable,tablelen,h)
  178. if slot!= 'full':
  179. hashtable[slot]=h
  180. return True
  181. if slot=='full':
  182. return False
  183. else:
  184. hashtable[h]=h
  185. return True
  186.  
  187. def findslot(hashtable,tablelen,h): #uses the next open slot
  188. hO=h #orignal location
  189. if h+1> tablelen: #end ot table
  190. nslot=overrun(hashtable,hO)
  191. if h+1 <= tablelen:
  192. while h+1 < tablelen and hashtable[h+1]!=NULL:
  193. print 'Notify: table here already matched'
  194. h+=1
  195. if h+1 < tablelen and hashtable[h+1]==NULL :
  196. nslot=h+1
  197. print 'Notify: new slot is %s' % nslot
  198. return nslot
  199. else: #h+1 > tablelen:
  200. nslot=overrun(hashtable,hO)
  201. return nslot
  202. else:
  203. nslot=overrun(hashtable,hO)
  204. return nslot
  205.  
  206. def overrun(hashtable, hO): #table overrun
  207. n=0
  208. h=-1 #loop back to check the start
  209. while hashtable[h+1]!=NULL and h<hO:
  210. print 'Debug: Looping back h= ', h
  211. print 'Notify: table here already matched'
  212. h+=1
  213. if hashtable[h+1]==NULL and h<hO:
  214. nslot=h+1
  215. print 'Notify: new slot is %s' % nslot
  216. return nslot
  217.  
  218. if  h>=hO:
  219. print 'Notify: table full!\n'
  220. return 'full'
  221.  
  222. def tinyhash(item):
  223. return len(item)
  224.  
  225. def hashtable_destroy(hashtable,tablelen):
  226. hashtable=['']*0
  227. print '\nDestroy\n'
  228. return hashtable
  229.  
  230. def hprint(tablelen):
  231. n=0
  232. print "index,bucket"
  233. while n <tablelen:
  234. print '[%s,%s]' % (n, hashtable[n])
  235. n+=1
  236.  
  237. def hashtable_lookup(hashtable, tablelen, item):
  238. ih=0 #index table
  239. results=''
  240. match=tinyhash(item)#since this is a destructive hash we need to hash the item to know what to look for
  241. while ih< tablelen:
  242. if hashtable[ih]==match:
  243. results=results+str(ih)+' '
  244. ih+=1
  245. else:
  246. ih+=1
  247. return results
  248.  
  249.  
  250. '''----------------CODE TIME------------ '''
  251.  
  252. size=10
  253. tablelen=size
  254.  
  255. hashtable_construct(size,hashtable,hashfunction,equals)
  256. item= 'tree'
  257. hashtable_insert(hashtable,item)
  258. item='frog'
  259. hashtable_insert(hashtable,item)
  260.  
  261. hprint(tablelen)
  262.  
  263. results = hashtable_lookup(hashtable, tablelen, 'frog')
  264. print 'locations:',results
  265.  
  266. hashtable=hashtable_destroy(hashtable,tablelen)
  267.  
  268. tablelen=0
  269. hprint(tablelen)
  270.  
  271.  
  272.  
  273.  
  274.  
  275.  
  276.  
  277.  
  278. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement