Problem gibt:das beste Kompression
eine Liste von Strings Gegeben, finden den Teil die, wenn sie von Anfang an von allen Saiten abgezogen, wo sie paßt und durch einen Escape-Byte ersetzt, gibt die kürzeste Gesamtlänge
Beispiel:
"foo"
, "fool"
, "bar"
Das Ergebnis ist: "foo", wie die Basiszeichenfolge mit den Zeichenfolgen "\0"
, "\0l"
, "bar"
und einer Gesamtlänge von 9 Bytes. "\0"
ist das Escape-Byte. Die Summe der Länge der ursprünglichen Strings ist 10, also haben wir in diesem Fall nur ein Byte gespeichert.
Ein naiver Algorithmus würde wie folgt aussehen:
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
, die uns die Antwort geben wird, aber es ist so etwas wie O ((n * m)^2), die zu teuer ist.
Hört sich gut an, obwohl ich denke, dass Sie wollen ((Tiefe - 1) * Frequenz), vorausgesetzt, die Größe der Ersetzung ist gleich der eines Zeichens (obwohl die Frage ein Byte sagt). Sollte in O (c) laufen, wobei c die Gesamtzahl der Zeichen ist. –
Der erste Teil baut im Grunde genommen einen Trie aus einer Liste von Strings. – Tyler
Haha, nein, es ist keine Hausaufgabe. Dafür bin ich viel zu alt. =) Ich habe eigentlich eine ziemlich gute, funktionierende Implementierung, aber es ist nicht garantiert, ein optimales Ergebnis zu liefern.Nette Idee mit einem Baum. –