/** * Function: TestHashTable * ----------------------- * Runs a test of the hashset using a frequency structure as the element * type. It will open a file, read each char, and count the number of * times each char occurs. Tests enter, lookup, and mapping for the hashset. * Prints contents of table to stdout. Then it dumps all the table elements * into a vector and sorts them by frequency of occurrences and * prints the array out. Note that this particular stress test passes * 0 as the initialAllocation, which the vector is required to handle * gracefully - be careful! */ static void TestHashTable(void) { hashset counts; vector sortedCounts; HashSetNew(&counts, sizeof(struct frequency), kNumBuckets, HashFrequency, CompareLetter, NULL); fprintf(stdout, "\n\n ------------------------- Starting the HashTable test\n"); BuildTableOfLetterCounts(&counts); fprintf(stdout, "Here is the unordered contents of the table:\n"); HashSetMap(&counts, PrintFrequency, stdout); // print contents of table VectorNew(&sortedCounts, sizeof(struct frequency), NULL, 0); HashSetMap(&counts, AddFrequency, &sortedCounts); // add all freq to array VectorSort(&sortedCounts, CompareLetter); // sort by char fprintf(stdout, "\nHere are the trials sorted by char: \n"); VectorMap(&sortedCounts, PrintFrequency, stdout); VectorSort(&sortedCounts, CompareOccurrences); //sort by occurrences fprintf(stdout, "\nHere are the trials sorted by occurrence & char: \n"); VectorMap(&sortedCounts, PrintFrequency, stdout); // print out array VectorDispose(&sortedCounts); // free all storage HashSetDispose(&counts); }
void calculateNext(hashset *hash, vector* keys, int k, char* f, int size) { int currK, i, elems = 0, seedNumber; char *nxt, *cnt, *key2, *storage = (char*)malloc(sizeof(char) * k); FILE *fileR; vectorv keyNext; keysv *rs, key; k+=1; fileR = fopen(f, "r"); assert(fileR != NULL && "Cannot open the file"); VectorNew(keys, sizeof(char*) * k, NULL, 10); while (fgets(storage, k, fileR) != NULL) { currK = strlen(storage); if (currK < k && storage[currK - 1] == '\n') { fgets(&storage[currK], k - currK, fileR); } VectorAppend(keys, storage); } storage = (char*)VectorNth(keys, keys->currentPosition - 1); fclose(fileR); HashSetNew(hash, sizeof(keysv), keys->currentPosition * 3, hashVector, cmpVector, NULL); for (i = 0; i < (keys->currentPosition - 1); i++) { rs = (keysv*)malloc(sizeof(keysv)); vector nexts; cnt = VectorNth(keys, i); nxt = VectorNth(keys, i + 1); rs->string = strdup(cnt); rs = (keysv*)HashSetLookup(hash, rs); keyNext.string = nxt; key.string = cnt; if (rs == NULL) { keyNext.frecuency = 1; VectorNew(&nexts, sizeof(vectorv), NULL, 1); VectorAppend(&nexts, &keyNext); key.frecuency = 1; key.vectorv = nexts; key.amount = 1; HashSetEnter(hash, &key); } else { rs->frecuency++; rs->amount++; vectorv* rSucessor; int idx = VectorSearch(&rs->vectorv, &keyNext, cmpvct, 0, false); if (idx >= 0) { rSucessor = VectorNth(&rs->vectorv, idx); rSucessor->frecuency++; } else { keyNext.frecuency = 1; VectorAppend(&rs->vectorv, &keyNext); } } } key.string = VectorNth(keys, keys->currentPosition - 1); key.frecuency = 1; key.amount = 0; HashSetEnter(hash, &key); if (k == 0) { elems = keys->currentPosition; } else { HashSetMap(hash, mapFn, &elems); } seedNumber = rand() % elems; key2 = (char*)VectorNth(keys, seedNumber); printf("Generated text:\n"); printf("%s", key2); if (k > 0) { for (i = 0; i < size;) { key2 = ran(hash, keys, key2); printf("%s", key2); if (strstr(key2, " ") != NULL || strstr(key2, "\n") != NULL) { i++; } } } else { for (i = 0; i < size;) { seedNumber = rand() % elems; key2 = (char*)VectorNth(keys, seedNumber); printf("%s", key2); if (strstr(key2, " ") != NULL || strstr(key2, "\n") != NULL) { i++; } } } printf("\n"); }
void WordCountSort(hashset *wordCount) { HashSetMap(wordCount, WordCountSortMapFn, NULL); }