Problème:Trouvez la sous-chaîne de préfixe qui donne la meilleure compression
Étant donné une liste de chaînes, trouver la sous-chaîne qui, si elle soustrait depuis le début de toutes les chaînes où il correspond et remplacé par un octet d'échappement, donne la longueur totale la plus courte.
Exemple:
"foo"
, "fool"
, "bar"
Le résultat est le suivant: "toto" que la chaîne de base avec les cordes "\0"
, "\0l"
, "bar"
et une longueur totale de 9 octets. "\0"
est l'octet d'échappement. La somme de la longueur des chaînes d'origine est 10, donc dans ce cas, nous avons seulement enregistré un octet.
Un algorithme naïf ressemblerait à ceci:
for string in list
for i = 1, i < length of string
calculate total length based on prefix of string[0..i]
if better than last best, save it
return the best prefix
Cela nous donnera la réponse, mais il est quelque chose comme O ((n * m)^2), ce qui est trop cher.
Ça sonne bien, même si je pense que vous voudriez ((profondeur - 1) * fréquence), en supposant que la taille du remplacement est égale à celle d'un caractère (bien que la question indique un octet). Doit fonctionner dans O (c) où c est le nombre total de caractères. –
La première partie est essentiellement la construction d'un trie à partir d'une liste de chaînes, soit dit en passant. – Tyler
Haha, non ce n'est pas un devoir. Je suis trop vieux pour ça. =) J'ai une assez bonne implémentation, mais il n'est pas garanti de donner un résultat optimal.Belle idée avec un arbre. –