Guest User

Untitled

a guest
Jun 14th, 2015
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.34 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <assert.h>
  3.  
  4. #include "state_set.h"
  5.  
  6. #define PRIME_ONE 811
  7. #define PRIME_TWO 853
  8. #define ARRAY_SIZE 1000000
  9. #define INITIAL_SLOT_SIZE 5L
  10.  
  11. struct state_set
  12. {
  13.     struct state **state_array[ARRAY_SIZE];
  14.     size_t slot_sizes[ARRAY_SIZE];
  15.     size_t slot_memory[ARRAY_SIZE];
  16. };
  17.  
  18. void error_validate_pointer(void *ptr)
  19. {
  20.     assert(ptr != NULL);
  21. }
  22.  
  23. struct state_set *state_set_init()
  24. {
  25.     struct state_set *new_set =
  26.             malloc(sizeof(struct state_set));
  27.  
  28.     for (int i = 0; i < ARRAY_SIZE; i++)
  29.     {
  30.         new_set->slot_sizes[i] = 0;
  31.         new_set->slot_memory[i] = INITIAL_SLOT_SIZE;
  32.     }
  33.     for (int i = 0; i < ARRAY_SIZE; i++)
  34.     {
  35.         new_set->state_array[i] =
  36.                 malloc(new_set->slot_memory[i] * sizeof(struct state*));
  37.         error_validate_pointer(new_set->state_array[i]);
  38.     }
  39.  
  40.     return new_set;
  41. }
  42.  
  43. int node_get_id(int s)
  44. {
  45.     return s;
  46. }
  47.  
  48.  
  49. void state_set_resize_slot(struct state_set *set, int slot_i)
  50. {
  51.     struct state **to_resize = set->state_array[slot_i];
  52.     to_resize =
  53.             realloc(to_resize, set->slot_memory[slot_i] * 2 * sizeof(struct state*));
  54.     error_validate_pointer(to_resize);
  55.     set->slot_memory[slot_i] *= 2;
  56. }
  57.  
  58. long int state_set_hash(struct state *state)
  59. {
  60.     long int a = node_get_id(state->previous_word);
  61.     long int b = node_get_id(state->n);
  62.     long int c = state->suf_id;
  63.  
  64.     long int h = ((a * PRIME_ONE + b) * PRIME_TWO + c) % ARRAY_SIZE;
  65.  
  66.     return 1;
  67. }
  68.  
  69. int state_is_equal(struct state *s1, struct state *s2)
  70. {
  71.     return (s1->n == s2->n && s1->previous_word == s2->previous_word && s1->suf_id == s2->suf_id);
  72. }
  73.  
  74. int state_set_add(struct state_set *set, struct state *state)
  75. {
  76.     state_set_resize_slot(set, 1);
  77.     long int h = state_set_hash(state);
  78.     struct state **states = set->state_array[h];
  79.  
  80.     for (int i = 0; i < set->slot_sizes[h]; i++)
  81.     {
  82.         if (state_is_equal(state, states[i]))
  83.             return 0;
  84.     }
  85.  
  86.     if (set->slot_sizes[h] + 1 > set->slot_memory[h])
  87.     {
  88.         state_set_resize_slot(set, h);
  89.     }
  90.  
  91.     states[set->slot_sizes[h]] = state;
  92.     set->slot_sizes[h] += 1;
  93.     return 1;
  94. }
  95.  
  96. void state_set_done(struct state_set *set)
  97. {
  98.     for (int i = 0; i < ARRAY_SIZE; i++)
  99.     {
  100.         free(set->state_array[i]);
  101.     }
  102.     free(set);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment