Apuesto a que alguien ha resuelto esto antes, pero mis búsquedas han quedado vacías.Algoritmo de empaque de texto
Quiero incluir una lista de palabras en un búfer, haciendo un seguimiento de la posición inicial y la longitud de cada palabra. El truco es que me gustaría empacar el buffer de manera eficiente eliminando la redundancia.
Ejemplo: casa de muñeca dollhouse
Estos se pueden embalar en el búfer simplemente como dollhouse
, recordando que doll
es cuatro letras a partir de la posición 0, dollhouse
es nueve letras en 0, y house
es de cinco letras en 3.
Lo que he encontrado hasta el momento es:
- Ordenar las palabras más larga a la más corta: (casa de muñecas, casa, muñeca)
- Escanee el búfer para ver si la cadena ya existe como una subcadena, de ser así, tenga en cuenta la ubicación.
- Si no existe, agréguelo al final del búfer.
Dado que las palabras largas a menudo contienen palabras más cortas, esto funciona bastante bien, pero debería ser posible hacerlo mucho mejor. Por ejemplo, si extiendo la lista de palabras para incluir ragdoll, mi algoritmo aparece con dollhouseragdoll
que es menos eficiente que ragdollhouse
.
Este es un paso de preprocesamiento, por lo que no estoy muy preocupado por la velocidad. O (n^2) está bien. Por otro lado, mi lista real tiene decenas de miles de palabras, por lo que O (n!) Probablemente esté fuera de discusión.
Como nota al margen, este esquema de almacenamiento se utiliza para los datos en la tabla `nombre 'de una fuente TrueType, cf. http://www.microsoft.com/typography/otspec/name.htm
¿No puedes simplemente usar algo como gzip? – Zifre
Lo que está describiendo es lo que hacen todos los algoritmos de compresión, excepto que está agregando la restricción de mirar palabras de texto plano como los elementos que se comprimen en lugar de bits. –
No es exactamente lo mismo que los algoritmos de compresión, porque cada palabra debe mantener su "palabrería". Como dije en otro comentario, no se puede combinar "lawman" y "woman", pero en compresión, estaría bien comprimir "man" juntos porque no es necesario mantener un buffer consistente. –