TGGC hat geschrieben:Das muss ein ziemlicher schlechter Packalgo sein, wenn er nichtmal eine -1 im Zweierkomplement vernuenftig packen kann. Macht es bei dem wirklich noch Sinn, mit solchem Bitgeschiebe ein paar Prozent rauszuholen?
EIn Reihe von kleinen negativen Integern im Zweierkomplement kann er sehr gut packen. Man erhält dann viele 1en und somit im Idealfall viele Bytes mit dem Wert 255. Das Problem ist der Übergang von negativ zu positiv. Hier ist es durchaus besser für den Algo wenn Werte, die sich nur durch das Vorzeichen unterscheiden, möglichst viele identische Bits aufweisen.
Ehrlich gesagt bin ich bislang aber nur von vorzeichenlosen Werten ausgegangen. Mit Gleitkommawerten und vorzeichenbehafteten Werten gibt es da in der Tat Probleme was die Effizienz angeht.
Bilddaten sind aber zum Glück meist vorzeichenlos, genau wie Textdaten. Daher wird man hier selten eine große Veränderung im Bitmuster haben, wenn sich die Werte der Bytes kaum ändern. Ausnahmen sind halt die Sprünge bei 2er-Potenzen. Höherwertige Bits bleiben dann aber dennoch identisch.
Allerdings geht es hier ja nur um die Delta-Kompression, wo immer Vorzeichen dabei sind und die Werte unabhängig von den eigentlichen Daten (bzw. deren Repräsentation) sind. Hier das Zweier-Komplement zu umgehen hat also keinen Einfluss auf die Eingangsdaten oder andersrum.
Genauer gesagt: Wenn ich eine -1 in den Eingangsdaten habe (im Zweier-Komplement), dann kann das auch so bleiben. Die Differenz zum Vorgängerbyte hat dann einen Wert von -127 bis +127. Dieser Wert wird dann nicht im Zweier-Komplement gespeichert und kann besser gepackt werden. Das Bit-Packing und dessen Effizienz ist dann aber unabhängig davon ob die -1 in den Eingangsdaten im Zweier-Komplement vorliegt oder nicht.
Das Ganze war nur ein kleiner Gedankengang meinerseits. Ob es (Deltakompression + Bit-Packing) effizient ist glaub ich eigentlich selbst nicht. Da braucht man schon sehr geeignete Daten. Ich überlege ob man das über eine Art Sprungliste für bestimmte Bereiche machen könnte, quasi ein partielles Filtern. Dafür braucht man wieder Zusatzinfos (Anzahl der Bereiche, Offset und Länge pro Bereich), aber vielleicht bringt es was.
Ich hatte mir gedacht, dass ich das nur auf Daten anwende, die nicht ohnehin schon gut RLE-komprimierbar sind oder als Match auftauchen. Das ist dann aber wieder ziemlich aufwendig bei der Analyse, da ich ja erst filtern und dann nach RLE/Matches suchen muss.
Ohne Input kein Output.