Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: AlbertoBSD en 22 Julio 2016, 19:03 pm



Título: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 22 Julio 2016, 19:03 pm
Muy buen dia estoy buscando optimizar el tamaño de una estructura dada.

Habia visto que es posible especificar el tamaño de una variable a nivel de bits.

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x,y;
  5. struct nodo *aristas[4];
  6. };
  7.  

Quiero optimizar las variables tabla, x é y

Las variables solo tiene valores del 0 al 15, con lo cual 4 bits serian suficientes.

Habia visto que se puede especificar el tamaño de la variable ejemplo:

Código
  1. struct nodo {
  2. int id;
  3. unsigned char tabla[4][4];
  4. unsigned char x:4;
  5. unsigned char y:4;
  6. struct nodo *aristas[4];
  7. };
  8.  

Pero no se hacerlo para la variable tabla.

Saludos!


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: ivancea96 en 22 Julio 2016, 19:18 pm
Con arrays no se puede.

Sin embargo, si tienes un tabla[4][4], y quieres que sea cada uno de 1 bit, por ejemplo, te sirve poner un uint16_t, y acceder con operadores de bit.


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: crack81 en 22 Julio 2016, 19:30 pm
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t  2 bytes

PD: Cual es el objetivo de optimizar el struct?
Saludos....


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: ivancea96 en 22 Julio 2016, 19:36 pm
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t  2 bytes
Si es [4][4], son 16 bits, 2 bytes


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 22 Julio 2016, 19:48 pm
PD: Cual es el objetivo de optimizar el struct?

El objetivo es ahorrar espacio para guardar la tabla en archivos, el detalle es que en este punto el programa sigue generando Nodos y  actualmente lleva mas de 7.8 Millones de Nodos

Cuenta, 16 bytes por 7.8 Millones en un archivo son 124 MB por lo cual poder quitarle la mitad del peso se me haria fantastico, ya que en este punto desconozco cuantos nodos mas se valla a generar.

ivancea96, creo que voy a tener una estructura adicional asi como lo comentas, y calcular esa estructura con operaciones de bits y Guardar el resultado en una sola variable de 64 bits.

Lo que seria un unsgined long long


Saludos!


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: crack81 en 22 Julio 2016, 20:46 pm
Si lo resuelves el problema estaría genial que publicaras como lo hiciste
Saludos...


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 22 Julio 2016, 22:03 pm
Código
  1. #include<stdio.h>
  2.  
  3. struct nodo {
  4. int id;
  5. unsigned char tabla[4][4];
  6. unsigned char x,y;
  7. struct nodo *aristas[4];
  8. };
  9.  
  10. int main() {
  11. int i = 0,j;
  12. struct nodo a;
  13. unsigned long long int c = 0;
  14. while(i < 4) {
  15. j = 0;
  16. while(j < 4) {
  17. a.tabla[i][j] = 16;
  18. c = c<<4;
  19. c += a.tabla[i][j];
  20. j++;
  21. }
  22. i++;
  23. }
  24. printf("%llu",c);
  25. }

Pues el ejemplo asi quedo, se termina guardando todo el arreglo en una sola variable de 64bits y simplemente me quedaría usar fwrite para guardar la variable en archivo. Y aplicaría el método inverso para devolverla a una tabla.

Saludos!


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 23 Julio 2016, 05:19 am
Pues resulta que esa aproximacion que publique, ya implementada es muy lentaaaa  :-\

Tendre que o bien conformarme con la estructura original o en su defecto reprogramar la funcion que crea los nodos para que desde el principio se encuentren "comprimidos" en memoria la informacion deseada.

Saludos


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: ivancea96 en 23 Julio 2016, 13:49 pm
Lo que te comentaba, es que en vez de mantener tu tabla de 4x4, pongas directamente el uint64_t y trabajes con él. Luego, basta hacer un par de funciones o defines para acceder a los datos :o


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 23 Julio 2016, 15:25 pm
Voy a implementarlo asi como comentas.

Por cierto en este punto ya van 16.8 Millones De Nodos en el Grafo y en  el Arbol  ;-) ;-)  ;-)  y el archivo pesa sobre 320 MB.

Saludos


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: MAFUS en 23 Julio 2016, 15:44 pm
He estado un poco desconectado. ¿De que va tu programa?


Título: Re: Optimizar tamaño de estructura de Datos
Publicado por: AlbertoBSD en 23 Julio 2016, 16:18 pm
Es bueno verte por aqui  ;D

Es parte del Juego del imposible

http://foro.elhacker.net/programacion_cc/iquestimposible_juego_de_rompecabezas_imposible-t455410.0.html

Propuse que se creara un grafo para ver todas las posibilidades.

Y tal vez encontar la menor combinación de teclas para llegar de una configuracion a otra usando dijsktra

El programa actual ya funciona muy bien para hacer el grafo me auxlio de una arreglo y un arbol.

El arreglo tiene una lista de todos los nodos del grafo y el arbol me ayuda a buscar rapidamente si alguna conbinacion ya existe o no.

El detalle que quiero optimizar la estructura para que no ocupe tanto espació en archivo ni en RAM

Saludos