• Domingo 15 de Diciembre de 2024, 07:08

Autor Tema:  teoria vs practica  (Leído 1427 veces)

Alfonsos1

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
teoria vs practica
« en: Viernes 14 de Enero de 2011, 19:15 »
0
si no me equivoco, 1 byte puede almacenar 256 valores distintos, por ejemplo del 0 al 255

supongamos que queremos guardar en un archivo 100 numeros, cada uno con valores entre 0 y 255, en ese caso nesesitariamos como minimo 100 bytes.

pero ahora supongamos que los numeros siempre estaran en orden de menor a mayor. En teoria, vastaria con menos de 100 bytes, pero en la practica no sarbria como hacerlo con menos de 100 bytes.

¿Cren que sea posible?
¿Cuanto es el minimo de memoria?

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: teoria vs practica
« Respuesta #1 en: Viernes 14 de Enero de 2011, 21:51 »
0
Es bueno saber que aún existen programadores que no desean desperdiciar memoria(espacio) obscenamente. Sin embargo también es bueno evitar desperdiciar tiempo (de proceso) o hacer el programa innecesariamente complejo.
Un byte por número me parece el punto de equilibrio ideal.

Puedes ahorrar más espacio usando algoritmos de compresión, por ejemplo la biblioteca 7z. Pero esto sólo tiene sentido si tus datos ocupan varios MBytes, no vale la pena por 100 Bytes.

De hecho para lograr el mínimo teórico tendrías que lograr comprimir esa información hasta alcanzar su estado máximo de entropía.

Una forma simple sería calcular las diferencias (recodificación para hacer más evidente correlaciones en la información a comprimir) y luego aplicar un codificador de entropía como este: http://en.wikipedia.org/wiki/Huffman_coding.

Datos originales                      :  1 , 2 , 4, 5, 7, 9, 12, 15, 16, 20
Diferencias(comenzando con 0):  1,  1,  2, 1, 2, 2, 3,   3,   1,  4
Si sólo exitieran 4 valores para las diferencias (1, 2, 3 y 4) el algoritmo huffman codificaría dichos números en 2 bits, ahorrando 75 bytes para ese caso muy particular. (En general asigna códigos de tamaño variable más chicos a elementos más frecuentes y códigos de tamaño variable más largos a los menos frecuentes).

Sin embargo también es necesario guardar la tabla de traducción de nuevos códigos de 2 bits a sus originales de 8 bits (o el árbol de codificación que a veces ocupa menos espacio). También es necesario espacio para guardar la implementación del algoritmo necesario para descomprimir la información. Asi que por todo lo anterior no es práctico comprimir una cantidad de información tan pequeña, a menos que sea por fines puramente académicos.

Alfonsos1

  • Miembro activo
  • **
  • Mensajes: 60
    • Ver Perfil
Re: teoria vs practica
« Respuesta #2 en: Viernes 14 de Enero de 2011, 23:03 »
0
no conocia el algoritmo de huffan, pero si entendi bien no me serviria porque las diferencias pueden ser de hasta 255, por ejemplo: ...0,0,0,0,255,255,255,...

la razón por la que quiero eficiencia, es porque dicha lista de numeros ba a ser descargada de internet por un programa

me puse a sacar algunas cuentas:

la cantidad de combinaciones que hay en 100 bytes es de 256^100 aprox 7*10^240
sin embargo la cantidad de combinaciones que nesesito son de 99263936, logaritmo base 2 de dicha cantidad es 26.5 lo que significa que con 27 bits puedo almacenar cada una de las distintas posibilidades, lo que es casi 30 veses mas eficiente que usar 100 bytes.

espero no haberme equivocado en las cuentas  :wacko: , ahora me resta hacer el sistema de codificacion y decodificacion :blink: