]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - src/blocksorting/bs.c
borro el archivo temporal cuando no lo uso mas.
[z.facultad/75.06/jacu.git] / src / blocksorting / bs.c
1
2 #include "bs.h"
3
4 /* Block Sorting Optimizado en memoria! */
5
6 typedef struct _bs_decode_t_ {
7         char c;
8         unsigned long int pos;
9 } t_BlockSortDecode;
10
11 char es_menor(char *data, t_BlockSort *bs, int i, int j);
12
13 int _compare(const void *d1, const void *d2) {
14         t_BlockSortDecode *s1, *s2;
15
16         s1 = (t_BlockSortDecode *)d1;
17         s2 = (t_BlockSortDecode *)d2;
18
19         return (s1->c - s2->c);
20 }
21
22 int __compare(const void *d1, const void *d2) {
23         t_BlockSortData *s1, *s2;
24
25         s1 = (t_BlockSortData *)d1;
26         s2 = (t_BlockSortData *)d2;
27
28         return es_menor(s1->bs->data, s1->bs, s1->pos_inicial, s2->pos_inicial);
29 }
30
31 char es_menor(char *data, t_BlockSort *bs, int i, int j)
32 {
33         unsigned long int pi, pj, k;
34
35         for(k=0; k<bs->len; k++) {
36                 pi = (i+k)%bs->len;
37                 pj = (j+k)%bs->len;
38
39                 if (data[pi] > data[pj]) return 1; /* El primero es mayor */
40                 if (data[pi] < data[pj]) return -1; /* El primero es menor */
41         }
42
43         /* Son iguales! */
44         return 0;
45 }
46
47 void generar_array(char *data, t_BlockSort *bs)
48 {
49         int i;
50         for(i=0; i<bs->len; i++) {
51                 bs->array[i].pos_inicial = i;
52                 bs->array[i].pos_final = (i+bs->len-1)%bs->len;
53                 bs->array[i].ord = (i==0)?1:0;
54                 bs->array[i].bs = bs;
55         }
56 }
57
58 void ordenar_array(char *data, t_BlockSort *bs)
59 {
60         qsort(bs->array, bs->len, sizeof(t_BlockSortData), __compare);
61 }
62
63 void print_(char *data, unsigned long int pos, unsigned long int len)
64 {
65         unsigned long int i;
66
67         for(i=0; i<len; i++)
68                 printf("%c", data[(pos+i)%len]);
69         printf("\n");
70 }
71
72 int generar_salida(char *data, t_BlockSort *bs, char *salida)
73 {
74         unsigned long int i, k;
75         k=-1;
76         for(i=0; i<bs->len; i++) {
77                 /* print_(data, bs->array[i].pos_inicial, bs->len); */
78                 salida[i] = data[bs->array[i].pos_final];
79                 if (bs->array[i].ord == 1) k = i;
80         }
81         return k;
82 }
83
84 void bs_solve(char *in, char *out, t_BlockSort *bs, unsigned long int *k, unsigned int leido)
85 {
86         unsigned int l;
87         l = bs->len;
88         /* Hack para pedasos menores a la pagina */
89         if (leido < bs->len) bs->len = leido;
90         bs->data = in;
91
92         generar_array(in, bs);
93         ordenar_array(in, bs);
94         (*k) = generar_salida(in, bs, out);
95
96         bs->len = l;
97 }
98
99 void bs_restore(char *dst, char *c, unsigned long int k, unsigned long int len)
100 {
101         unsigned long int i, current;
102         t_BlockSortDecode *in;
103
104         in = malloc(sizeof(t_BlockSortDecode)*len);
105
106         for(i=0; i<len; i++) {
107                 in[i].c = c[i];
108                 in[i].pos = i;
109         }
110
111         qsort(in, len, sizeof(t_BlockSortDecode), _compare);
112         
113         current = k;
114         i=0;
115         do {
116                 dst[i++] = in[current].c;
117                 current = in[current].pos;
118         } while (current != k);
119         free(in);
120 }
121
122 t_BlockSort *bs_create(unsigned long int len)
123 {
124         t_BlockSort *tmp;
125
126         tmp = malloc(sizeof(t_BlockSort));
127         tmp->array = malloc(sizeof(t_BlockSortData)*len);
128         tmp->len = len;
129
130         return tmp;
131 }
132
133
134 void bs_destroy(t_BlockSort *bs)
135 {
136         free(bs->array);
137         free(bs);
138 }
139