示例#1
0
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;
}
示例#2
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);
  
}
示例#3
0
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
}