Advertisement
AliAbdulKareem

count inversions in n log n time

Jan 30th, 2022
1,648
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.31 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5. typedef enum vec_state
  6. {
  7.     vec_error = 0,
  8.     vec_init  = 1,
  9.     vec_free  = 2,  
  10.  
  11. }vec_state;
  12.  
  13. typedef struct vec_int
  14. {
  15.     int* mem_pool;
  16.     size_t capacity;
  17.     size_t size;    
  18.     vec_state state;
  19. }vec_int;
  20.  
  21. typedef struct InvVec
  22. {
  23.     vec_int vec;
  24.     int count;
  25.  
  26. } InvVec;
  27.  
  28. vec_int vec_int_create(size_t capacity)
  29. {
  30.     vec_int vec;
  31.     if(capacity < 2) capacity = 2;
  32.     int* mem_pool = (int*) malloc(sizeof(int) * capacity);
  33.     if(mem_pool == NULL)
  34.     {
  35.         printf("init vector malloc failed...\n");
  36.         vec.mem_pool = NULL;
  37.         vec.size = 0;
  38.         vec.capacity = 0;
  39.         vec.state = vec_error;
  40.         return vec;
  41.     }
  42.     vec.mem_pool = mem_pool;
  43.     vec.size = 0;
  44.     vec.capacity = capacity;
  45.     vec.state = vec_init;
  46.     return vec;
  47. }
  48.  
  49.  
  50. static void vec_int_grow(vec_int* vec)
  51. {
  52.     size_t new_capacity = (vec->capacity * 3) / 2;
  53.     int* new_pool = (int*) malloc(sizeof(int) * new_capacity);
  54.     if(new_pool == NULL)
  55.     {
  56.         printf("Growing int vec failed\n ");
  57.         return;
  58.     }
  59.     for(size_t i = 0, n = vec->size; i < n; ++i)
  60.     {
  61.         new_pool[i] = vec->mem_pool[i];
  62.     }
  63.     free(vec->mem_pool);
  64.     vec->mem_pool = new_pool;
  65.     vec->capacity = new_capacity;
  66.  
  67. }
  68. void vec_int_add(vec_int* vec, int elem)
  69. {
  70.     if(vec->size >= vec->capacity)
  71.     {
  72.         vec_int_grow(vec);
  73.     }
  74.     vec->mem_pool[vec->size] = elem;
  75.     vec->size++;
  76. }
  77.  
  78. void vec_int_print(vec_int* vec)
  79. {
  80.     for(size_t i = 0, n = vec->size; i < n; ++i)
  81.     {
  82.         printf("%d ", vec->mem_pool[i]);
  83.     }
  84.     printf("\n");
  85. }
  86.  
  87. void vec_int_free(vec_int* vec)
  88. {
  89.     if(vec->state != vec_init)
  90.     {
  91.         printf("vec int not initialized... \n");
  92.         return;
  93.     }
  94.     free(vec->mem_pool);
  95.     vec->size = vec->capacity = 0;
  96.     vec->state = vec_free;
  97. }
  98. static void move_bytes(void* d,  void* s, size_t byte_count)
  99. {
  100.     unsigned char* dest = (unsigned char*) d;
  101.     unsigned char* source = (unsigned char*) s;
  102.     while(byte_count--) *dest++ = *source++ ;
  103. }
  104. void move_right(void* mem_begin, size_t index, size_t elem_size, void* mem_end)
  105. {
  106.     unsigned char* start = (unsigned char*)mem_begin + (index * elem_size);
  107.  
  108.     unsigned char* end =  mem_end;
  109.    
  110.     while(end != start )
  111.     {
  112.       move_bytes(end, end - elem_size, elem_size);
  113.       end -= elem_size;
  114.     }
  115. }
  116.  
  117. void move_left(void* mem_begin, size_t index, size_t elem_size, void* mem_end)
  118. {
  119.     unsigned char* start = (unsigned char*)mem_begin + (index * elem_size);
  120.  
  121.     unsigned char* end =  mem_end;
  122.     while(end != start)
  123.     {
  124.         move_bytes(start ,start + elem_size, elem_size);
  125.         start += elem_size;
  126.     }
  127.    
  128. }
  129.  
  130. void vec_int_insert(vec_int * vec, size_t index, int elem)
  131. {
  132.     if(vec->size >= vec->capacity)
  133.     {
  134.         vec_int_grow(vec);
  135.     }
  136.     move_right(vec->mem_pool, index, sizeof(int), & (vec->mem_pool[vec->size]) );
  137.     vec->size++;
  138.     vec->mem_pool[index] = elem;
  139.    
  140. }
  141.  
  142. void vec_int_delete(vec_int* vec, size_t index)
  143. {
  144.     if(vec->size == 0)
  145.     {
  146.         printf("empty vec... returning\n");
  147.         return;
  148.     }
  149.     move_left(vec->mem_pool, index, sizeof(int), &(vec->mem_pool[vec->size -1 ]));
  150.     vec->size--;
  151. }
  152.  
  153. void vec_int_set(vec_int* vec, int index, int elem)
  154. {
  155.     if(index >= (int)vec->size)
  156.     {
  157.         if(index >= (int)vec->capacity)
  158.         {
  159.             printf("this index is not reserved yet\n");
  160.         }
  161.         else
  162.         {
  163.             printf("this index is reserved but not yet added\n");
  164.         }
  165.         return;
  166.        
  167.     }
  168.  
  169.     else if(index < 0)
  170.     {
  171.         printf("passed a negative index\n");
  172.         return;
  173.     }
  174.     else
  175.     {
  176.         vec->mem_pool[index] = elem;
  177.     }
  178.  
  179. }
  180. int vec_int_get(vec_int* vec, int index)
  181. {
  182.     if(index < 0)
  183.     {
  184.         printf("passed a negative index\n");
  185.         return -1;
  186.     }
  187.     else if(index >= (int)vec->size)
  188.     {
  189.         printf("this element is outside the boundary of access\n");
  190.         return -1;
  191.     }
  192.     else
  193.     {
  194.         return vec->mem_pool[index];
  195.     }
  196.  
  197. }
  198.  
  199. vec_int vec_int_view(vec_int vec, size_t start_view_index, size_t size)
  200. {
  201.     vec.mem_pool = vec.mem_pool + start_view_index;
  202.     vec.size = size;
  203.     return vec;
  204. }
  205.  
  206. void vec_int_move(vec_int* dest, vec_int* src)
  207. {
  208.     *dest = *src;
  209.     src->mem_pool = NULL;
  210.     src->capacity = 0;
  211.     src->size = 0;
  212.     src->state = vec_free;
  213. }
  214.  
  215. void vec_int_copy(vec_int* dest, vec_int* src)
  216. {
  217.     if(dest->state == vec_init)
  218.     {
  219.         vec_int_free(dest);
  220.     }
  221.     size_t size = src->size;
  222.    
  223.     *dest = vec_int_create(src->capacity);
  224.     dest->size = size;
  225.  
  226.     int* s = src->mem_pool;
  227.     int* d = dest->mem_pool;
  228.     while(size--) *d++ = *s++ ;
  229.    
  230.    
  231. }
  232.  
  233.  
  234.  
  235. InvVec inv_merge(vec_int left, vec_int right)
  236. {
  237.  
  238.     int invCount = 0;
  239.     size_t n = left.size + right.size ;
  240.  
  241.     vec_int v = vec_int_create(n);
  242.  
  243.     size_t i,j,k;
  244.  
  245.     for(i = 0, j = 0; i < left.size && j < right.size; )
  246.     {
  247.         if( left.mem_pool[i] > right.mem_pool[j])
  248.         {
  249.             vec_int_add(&v,right.mem_pool[j++]);
  250.             invCount += left.size - i ;
  251.         }
  252.         else
  253.         {
  254.             vec_int_add(&v,left.mem_pool[i++]);
  255.         }
  256.     }
  257.  
  258.     if(i == left.size)
  259.     {
  260.         while(j < right.size)
  261.         {
  262.             vec_int_add(&v,right.mem_pool[j++]);
  263.         }
  264.     }
  265.  
  266.     else
  267.     {
  268.         while(i < left.size)
  269.         {
  270.             vec_int_add(&v,left.mem_pool[i++]);
  271.         }
  272.  
  273.     }
  274.    
  275.     i = j = k = 0;
  276.     while(i < left.size)
  277.     {
  278.         left.mem_pool[i++] = vec_int_get(&v,(int)k++);
  279.     }
  280.     while(j < right.size)
  281.     {
  282.         right.mem_pool[j++] = vec_int_get(&v,(int)k++);
  283.     }
  284.     vec_int_free(&v);
  285.  
  286.     InvVec inv = {vec_int_view(left, 0, left.size + right.size), invCount};
  287.     return inv;
  288. }
  289.  
  290. InvVec count_inv(InvVec v)
  291. {
  292.     if(v.vec.size < 2)
  293.     {
  294.         v.count = 0;
  295.         return v;
  296.     }
  297.     InvVec left  = count_inv((InvVec) {vec_int_view(v.vec, 0, v.vec.size/2), v.count});
  298.     InvVec right = count_inv((InvVec) {vec_int_view(v.vec, v.vec.size/2, v.vec.size - v.vec.size/2), v.count});
  299.     InvVec splits= inv_merge(left.vec, right.vec);
  300.  
  301.  
  302.     return (InvVec){splits.vec, left.count + right.count + splits.count};
  303. }
  304.  
  305. void count_inv_brute(vec_int* v)
  306. {
  307.     int count = 0;
  308.     for(int i = 0, n1 = (int)(v->size - 1) ; i < n1; ++i)
  309.     {
  310.         for(int j = i + 1, n2 = (int)(v->size); j < n2 ; ++j)
  311.         {
  312.             if(vec_int_get(v, i) > vec_int_get(v,j))
  313.             {
  314.                 ++count;
  315.             }
  316.  
  317.         }
  318.     }
  319.  
  320.     printf("counted inv  = %d\n",count);
  321. }
  322.  
  323.  
  324.  
  325.  
  326. int main()
  327. {
  328.     vec_int vec = vec_int_create(4);
  329.  
  330.     vec_int_add(&vec,10);
  331.     vec_int_add(&vec,15);
  332.     vec_int_add(&vec,25);
  333.     vec_int_add(&vec,-10);
  334.     vec_int_add(&vec,-17);
  335.     vec_int_add(&vec,-22);
  336.     vec_int_add(&vec,-0);
  337.     vec_int_add(&vec,11);
  338.    
  339.  
  340.  
  341.    
  342.  
  343.     vec_int_insert(&vec,vec.size,17);
  344.     vec_int_insert(&vec,1,0);
  345.  
  346.    
  347.     vec_int view = vec_int_view(vec,0,vec.size - 0);
  348.     vec_int_print(&vec);
  349.     vec_int_print(&view);
  350.    
  351.     count_inv_brute(&vec);
  352.     InvVec inv = {vec,0};
  353.     inv = count_inv(inv);
  354.  
  355.     printf("nlogn counted inversion =  %d\n",inv.count);
  356.  
  357.  
  358. }
  359.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement