SoloCodigo

Programación Específica => Diseño de Algoritmos => Mensaje iniciado por: su - en Domingo 21 de Mayo de 2006, 02:25

Título: Compresion
Publicado por: su - en Domingo 21 de Mayo de 2006, 02:25
Hola.
Bueno, lo que quiero es saber la mejor forma de comprimir un archivo y tengo un idea, pero tiene sus problemas:
Tengo un archivo de X tamaño.
Leo sierto numero de bits que es determinado por el tamaño del archivo (tiene que ser asi, porque es la unica forma de que no se sature la memoria), a esto lo llamo bloque.
Tomo este bloque y lo "desdoblo" en un orden ascendente de bits (pack("b*", bloque)) y remplaso sierta combinacion de unos y ceros por otros numeros.
El problema es que al "desdoblarlo" el tamaño del archivo queda mucho mas grande y al remplasar, el archivo queda mas grande.
El error es que al pasarlo a bits cada caractel queda en 8 bits de tamaño (es decir, la letra "a" queda en 8 unos y ceros, que cada uno ocupa 8 bits de taño)
Entonces, como seria el algoritmo perfecto para esto?
Gracias.
Título: Re: Compresion
Publicado por: bob esponja en Domingo 21 de Mayo de 2006, 05:42
yo hice un algoritmo de compresion medio choto que funciono, solo funciona para texto.
es asi:
el programa lee el archivo de texto, se fija los caracteres que no se usan y hace una tabla.
luego lee el archivo buscando las combinaciones de dos letras que mas se repiten y selecciona las N mas repetidas, elije los N primeros caracteres sin usar y remplaza esas duplas por estos caracteres, luego escribe una cabecera con la asignacion de caracteres y duplas.
si lo haces recursivamente sobre un archivo aleatorio ( yo usaba los man de linux :P ), podes llegar a comprimir un archivo al 60% de su tamaño.

eso es todo.

(no se mucho de algoritmos de compresion ese se me ocurrio y funciono)
Título: Re: Compresion
Publicado por: su - en Domingo 21 de Mayo de 2006, 16:15
Creo que asi funcionava el LZV1, pero encontr uno mejor:
http://en.wikipedia.org/wiki/LZO (http://en.wikipedia.org/wiki/LZO)
Gracias por la idea!
 :hola:
Título: Re: Compresion
Publicado por: su - en Miércoles 24 de Mayo de 2006, 02:09
Lo que decis se llama Huffman, y LZW es una libreria para esto, creo que las imagenes .gif usan este algoritmo
Aqui hay mas info:
http://www.perlmonks.org/?node_id=270016 (http://www.perlmonks.org/?node_id=270016)
 :smartass:
Título: Re: Compresion
Publicado por: su - en Sábado 24 de Junio de 2006, 01:49
:o Use aquella idea de combertir todo en bits y remplazarlo por caractles.
Es mu sinple, solo hago un loop que crea las caracteles ascii (33-256) y otro loop o bucle que toma el archivo, lo lee (con sysread) y crea sierto numero de bloques dependiendo de el tamaño del archivo.
Al final el resultado es comparable al del algoritmo compress de Unix, deve de funcionar con binarios o archivos ofuscados como base de datos.
Bueno, lo posteo por si sirve de algo  ;)
 :hola:
Título: Re: Compresion
Publicado por: Bicholey en Lunes 31 de Julio de 2006, 20:16
:P  :P  :P  :P


WOW fascinante.
Título: Re: Compresion
Publicado por: su - en Lunes 31 de Julio de 2006, 22:05
El problema es cuando el archivo es de 1M o menos, queda un poco mas grande por la diferencia en cada bloque.  :rolleyes: