int main(int argc,char* argv[]) { if ( argc > 10 ){ fprintf(stderr,"%s <string-to-be-permuted>[MAX 10 ARGS]\n",argv[0]); exit(EXIT_FAILURE); } for(int i=1;i<argc;i++){ permute_string(NULL,argv[i]); } return 0; }
int permute_string(char* starter,char* remain) { size_t r_len=( (remain == NULL)?0: strlen(remain)); // size_t s_len=strlen(starter); char* n_starter=NULL; char* n_remain=NULL; size_t n_starts=0; size_t cur_alloc_size=0; if ( r_len != 0){ // fprintf(stdout,"STARTER : %s\nREMAIN : %s\n",starter,remain); for(int i=0;i<r_len;i++){ n_starter=(char*)malloc(cur_alloc_size=(starter == NULL)? 2: (strlen(starter)) + 1 ); bzero(n_starter,cur_alloc_size+1); if (starter){ strncpy(n_starter,starter,cur_alloc_size); } strncat(n_starter, remain+i,1); n_remain=(char*)malloc(r_len); bzero(n_remain,r_len); strncpy(n_remain, remain+i+1 ,r_len -i-1); strncat(n_remain,remain, i ); // fprintf(stdout,"starter:%s remain:%s\n",n_starter,n_remain); permute_string(n_starter,n_remain); n_starts++; free(n_starter); free(n_remain); } } else { fprintf(stdout,"%s\n",starter); } //fprintf(stdout,"Made %d starters\n",n_starts); }
void do_statistical_tests() { #ifndef TRACK_STATISTICS printf("Enable TRACK_STATISTICS to do statistical tests...\n"); return ; #else /* some sizes test to see how the bitfield or rather hashing function behaves depending on its size. */ unsigned int sizes_to_test[] = {10000, /* 10 thousands bits, about 1.25 kilobytes. */ 100000, /* 12.5 kilobytes. */ 1000000, /* 125 kilobytes */ 10000000 /* 1.25 megabytes. */}, number_of_sizes = 4, index_0, index_1, number_of_strings = 10000; /* create two set of strings both of which are completely disjoint (if the empty string is excluded), in principles their shouldn't be any collisions. */ char **inserted_strings = get_combinations(number_of_strings, "abcdefghi"), **non_inserted_strings = get_combinations(number_of_strings, "jklmnopqr"); printf("Testing with combinations.\n"); membership_type *membership; for (index_0 = 0; index_0 < number_of_sizes; index_0++) { membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */ for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */ insert_string(membership, inserted_strings[index_1]); for (index_1 = 1; index_1 <= number_of_strings; index_1++) /* skip over the empty string */ if (!is_member(membership, inserted_strings[index_1], 1)) error("Failed to insert value!"); for (index_1 = 1; index_1 <= number_of_strings; index_1++) is_member(membership, non_inserted_strings[index_1], 0); printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings); printf("%u, %f%% collisions while inserting.\n", (unsigned int)(number_of_strings - membership->number_of_set_bits), (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100)); printf("%u, %f%% collisions while searching.\n", (unsigned int)(membership->number_of_false_positives), (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) ); printf("\n"); free_membership(membership); } for (index_0 = 0; index_0 < number_of_strings + 1; index_0++) { free(inserted_strings[index_0]); free(non_inserted_strings[index_0]); } printf("Testing with permutations.\n"); inserted_strings = permute_string("abcdefghi", number_of_strings); non_inserted_strings = permute_string("jklmnopqr", number_of_strings); for (index_0 = 0; index_0 < number_of_sizes; index_0++) { membership = create_membership(sizes_to_test[index_0]); /* create a new membership. */ for (index_1 = 0; index_1 < number_of_strings; index_1++) insert_string(membership, inserted_strings[index_1]); for (index_1 = 0; index_1 < number_of_strings; index_1++) if (!is_member(membership, inserted_strings[index_1], 1)) error("Failed to insert value!"); for (index_1 = 0; index_1 < number_of_strings; index_1++) is_member(membership, non_inserted_strings[index_1], 0); printf("Bitfield size %u number_of_strings %u\n", sizes_to_test[index_0], number_of_strings); printf("%u, %f%% collisions while inserting.\n", (unsigned int)(number_of_strings - membership->number_of_set_bits), (((unsigned int)(number_of_strings - membership->number_of_set_bits)/(double)(number_of_strings)) * 100)); printf("%u, %f%% collisions while searching.\n", (unsigned int)(membership->number_of_false_positives), (((unsigned int)(membership->number_of_false_positives)/(double)(number_of_strings)) * 100) ); printf("\n"); free_membership(membership); } for (index_0 = 0; index_0 < number_of_strings; index_0++) { free(inserted_strings[index_0]); free(non_inserted_strings[index_0]); } #endif }