]> git.llucax.com Git - z.facultad/75.06/jacu.git/blob - otros/blocksorting/bs.c
anda un rato y despues no anda mas, seguro que estoy pisando mucha memoria
[z.facultad/75.06/jacu.git] / otros / blocksorting / bs.c
1
2 /* Block Sorting Optimizado en memoria! */
3
4 #include <string.h>
5 #include <stdlib.h>
6 #include <stdio.h>
7
8 typedef struct _bs_data_t_ {
9         unsigned long int pos_inicial;
10         unsigned long int pos_final;
11         unsigned long int pos_orden;
12         char ord; /* indice si esta ordenada */
13 } t_BlockSortData;
14
15 typedef struct _bs_t_ {
16         t_BlockSortData *array;
17         unsigned long int *ord;
18         unsigned long int len;
19 } t_BlockSort;
20
21 char es_menor(char *data, t_BlockSort *bs, int i, int j)
22 {
23         unsigned long int pi, pj, k;
24
25         for(k=0; k<bs->len; k++) {
26                 pi = (bs->array[i].pos_inicial+k)%bs->len;
27                 pj = (bs->array[j].pos_inicial+k)%bs->len;
28
29                 if (data[pi] > data[pj]) return 0;
30                 if (data[pi] < data[pj]) return 1;
31         }
32
33         return 0;
34 }
35
36 void generar_array(char *data, t_BlockSort *bs)
37 {
38         int i;
39         for(i=0; i<bs->len; i++) {
40                 bs->array[i].pos_inicial = i;
41                 bs->array[i].pos_final = (i+bs->len-1)%bs->len;
42                 bs->array[i].pos_orden = 0;
43                 bs->array[i].ord = 0;
44         }
45 }
46
47 void ordenar_array(char *data, t_BlockSort *bs)
48 {
49         unsigned long int i, j, min;
50
51         for(i=0; i<bs->len; i++) {
52                 min = -1;
53                 for(j=0; j<bs->len; j++) {
54                         if (bs->array[j].ord) continue;
55                         if ((min==-1) || (es_menor(data, bs, j, min)))
56                                 min = j;
57                 }
58
59                 bs->array[min].ord = 1;
60                 bs->array[min].pos_orden = i;
61
62                 bs->ord[i] = min;
63         }
64 }
65
66 int generar_salida(char *data, t_BlockSort *bs, char *salida)
67 {
68         unsigned long int i, k;
69         k=-1;
70         for(i=0; i<bs->len; i++) {
71                 salida[i] = data[bs->array[bs->ord[i]].pos_final];
72                 if (bs->array[bs->ord[i]].pos_inicial == 0) k = i;
73         }
74         return k;
75 }
76
77 void bs_solve(char *in, char *out, t_BlockSort *bs, unsigned long int *k, unsigned int leido)
78 {
79         unsigned int l;
80         l = bs->len;
81         /* Hack para pedasos menores a la pagina */
82         if (leido < bs->len) bs->len = leido;
83         
84         generar_array(in, bs);
85         ordenar_array(in, bs);
86         (*k) = generar_salida(in, bs, out);
87
88         bs->len = l;
89 }
90
91 t_BlockSort *bs_create(unsigned int len)
92 {
93         t_BlockSort *tmp;
94
95         tmp = malloc(sizeof(t_BlockSort));
96         tmp->array = malloc(sizeof(t_BlockSortData)*len);
97         tmp->ord = malloc(sizeof(unsigned long int)*len);
98         tmp->len = len;
99
100         return tmp;
101 }
102
103
104 void bs_destroy(t_BlockSort *bs)
105 {
106         free(bs->array);
107         free(bs->ord);
108         free(bs);
109 }
110
111 int main(int argc, char *argv[])
112 {
113         char *data; 
114         char *salida;
115         unsigned long int len, i, k;
116         FILE *fp;
117         char c;
118         t_BlockSort *bs;
119
120         if (argc != 3) {
121                 printf("Modo de uso : %s <archivo datos> <tamaƱo pagina>\n", argv[0]);
122                 return 0;
123         }
124
125         fp = fopen(argv[1], "r");
126         len = atoi(argv[2]);
127
128         data = malloc(sizeof(char)*len);
129         salida = malloc(sizeof(char)*len);
130
131         bs = bs_create(len);
132
133         while ((c = fgetc(fp)) != EOF) {
134                 i = 0;
135                 while ((c!=EOF) && (i < len)) {
136                         data[i++] = c;
137                         c = fgetc(fp);
138                 }
139                 bs_solve(data, salida, bs, &k, i);
140
141                 /* XXX ACA SALIDA DEBERIA PASAR A LA SIGUIENTE ETAPA XXX */
142         }
143         fclose(fp);
144         bs_destroy(bs);
145
146         free(data);
147         free(salida);
148         return 0;
149 }
150
151