algorithm - paso - Un algoritmo de compresión eficiente para cadenas cortas de texto
lzw compression tiff (7)
Cualquier algoritmo / biblioteca que admita un diccionario preestablecido, por ejemplo, zlib .
De esta forma, puede cebar el compresor con el mismo tipo de texto que es probable que aparezca en la entrada. Si los archivos son similares de alguna manera (por ejemplo, todas las URL, todos los programas C, todas las publicaciones de StackOverflow, todos los dibujos de arte ASCII), entonces aparecerán ciertas subcadenas en la mayoría o en todos los archivos de entrada.
Cada algoritmo de compresión ahorrará espacio si la misma subcadena se repite varias veces en un archivo de entrada (por ejemplo, "el" en el texto en inglés o "int" en el código C).
Pero en el caso de las URL, ciertas cadenas (por ejemplo, " http: // www .", ".com", ".html", ".aspx" aparecerán típicamente una vez en cada archivo de entrada. Por lo tanto, debe compartirlas entre archivos). De alguna manera, en lugar de tener una ocurrencia comprimida por archivo, colocarlos en un diccionario preestablecido lo conseguirá.
Estoy buscando un algoritmo para comprimir cadenas de texto pequeñas: 50-1000 bytes (es decir, URL). ¿Qué algoritmo funciona mejor para esto?
Echa un vistazo a Smaz :
Smaz es una biblioteca de compresión simple adecuada para comprimir cadenas muy cortas.
Es posible que desee echar un vistazo a Esquema de Compresión Estándar para Unicode .
SQL Server 2008 R2 lo usa internamente y puede lograr hasta 50% de compresión.
Huffman tiene un costo estático, la tabla de Huffman, así que no estoy de acuerdo, es una buena opción.
Hay versiones adaptativas que eliminan esto, pero la tasa de compresión puede sufrir. En realidad, la pregunta que debe hacerse es "qué algoritmo para comprimir cadenas de texto con estas características". Por ejemplo, si se esperan largas repeticiones, la simple codificación Run-Lengh podría ser suficiente. Si puede garantizar que solo estarán presentes las palabras, los espacios, la puntuación y los dígitos ocasionales en inglés, Huffman con una tabla Huffman predefinida podría arrojar buenos resultados.
En general, los algoritmos de la familia Lempel-Ziv tienen muy buena compresión y rendimiento, y abundan las bibliotecas para ellos. Yo iría con eso.
Con la información de que lo que se comprime son URLs, entonces sugiero que, antes de comprimir (con cualquier algoritmo que esté fácilmente disponible), los CODIFIQUE. Las URL siguen patrones bien definidos, y algunas partes son altamente predecibles. Al utilizar este conocimiento, puede codificar las URL en algo más pequeño para empezar, y las ideas detrás de la codificación Huffman pueden ayudarlo aquí.
Por ejemplo, al traducir la URL a un flujo de bits, podría reemplazar "http" con el bit 1, y cualquier otra cosa con el bit "0" seguido del procotol real (o use una tabla para obtener otros protocolos comunes, como https, ftp, archivo). El ": //" se puede descartar por completo, siempre que pueda marcar el final del protocolo. Etc. Lea sobre el formato de URL y piense en cómo pueden codificarse para ocupar menos espacio.
No tengo el código a mano, pero siempre me gustó el enfoque de construir una tabla de búsqueda 2D de 256 * 256 caracteres ( RFC 1978 , PPP Predictor Compression Protocol ). Para comprimir una cadena, recorre cada char y utiliza la tabla de búsqueda para obtener la siguiente char ''predicha'' usando la char actual y la anterior como índices en la tabla. Si hay una coincidencia, escriba un solo bit de 1, de lo contrario escriba un 0, el carácter y actualice la tabla de búsqueda con el carácter actual. Este enfoque básicamente mantiene una tabla de búsqueda dinámica (y cruda) del siguiente personaje más probable en la secuencia de datos.
Puede comenzar con una tabla de búsqueda a cero, pero obviamente funciona mejor en cadenas muy cortas si se inicializa con el carácter más probable para cada par de caracteres, por ejemplo, para el idioma inglés. Siempre que la tabla de búsqueda inicial sea la misma para la compresión y la descompresión, no es necesario que la emita en los datos comprimidos.
Este algoritmo no proporciona una relación de compresión brillante, pero es increíblemente frugal con la memoria y los recursos de la CPU y también puede trabajar en un flujo continuo de datos: el descompresor mantiene su propia copia de la tabla de búsqueda a medida que descomprime, por lo tanto, la tabla de búsqueda se ajusta al tipo de datos que se comprimen.
Si está hablando de comprimir el texto no solo acortando, deflacta / gzip (envoltura alrededor de gzip), zip funciona bien para archivos y texto más pequeños. Otros algoritmos son altamente eficientes para archivos más grandes como bzip2, etc.
Wikipedia tiene una lista de tiempos de compresión. (busque la comparación de la eficiencia)
Name | Text | Binaries | Raw images
-----------+--------------+---------------+-------------
7-zip | 19% in 18.8s | 27% in 59.6s | 50% in 36.4s
bzip2 | 20% in 4.7s | 37% in 32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip | 24% in 21.1s | 37% in 70.6s | 57& in 41.6s
gzip | 25% in 4.2s | 39% in 23.1s | 60% in 5.4s
zip | 25% in 4.3s | 39% in 23.3s | 60% in 5.7s
La codificación de Huffman generalmente funciona bien para esto.