-
Die Erfindung betrifft Kompressionssysteme für digitale Daten
und insbesondere invertierbare oder verlustfreie
Kompressionssysteme für digitale Daten.
-
Es wird bezug genommen auf unsere gleichlaufend eingereichte
EP-Anmeldung (D/88068) mit dem Titel "Search Tree Data
Structure Encoding for Textual Substitution Data Compression
Systems". Eine gemeinsame detaillierte Beschreibung ist
verwendet worden, da die Erfindungen, die durch beide
Anwendungen abgedeckt werden, auf verschiedene Weise
kombiniert werden können.
-
Digitale Datenkompression ist ein wichtiges Werkzeug, da sie
beispielsweise zur Verringerung von Speicheranforderungen für
Dateien verwendet werden kann, um die Rate, mit der Daten
über Kommunikationskanäle mit beschränkter Bandbreite
übertragen werden können, zu erhöhen, und um die interne
Redundanz von Daten vor ihrer Verschlüsselung zu verringern,
so daß eine erhöhte Sicherheit geschaffen wird.
-
Es gibt Datenkompressionssysteme für spezielle Zwecke und für
allgemeine Zwecke. Systeme für spezielle Zwecke sind oft
angemessen, wenn sie verwendet werden, um Quelldaten für die
sie optimiert worden sind, zu komprimieren. Außerdem werden
Systeme für allgemeine Zwecke herkömmlicherweise so
konstruiert, daß sie den Quelldaten angepaßt sind, so daß sie
im allgemeinen besser zum Komprimieren unbekannter oder
verschiedener Quelldatentypen geeignet sind. Idealerweise
sind diese Systeme für allgemeine Zwecke nicht nur in der
Lage, sich sofort fundamentalen Änderungen in der Struktur
der Zusammensetzung der Quelldaten anzupassen, wie dies
erforderlich sein kann, um eine signifikante Kompression für
kleine Dateien und für Quellen mit intern inkonsistenten
statistischen Charakteristika zu liefern, sondern auch in der
Lage, eine nahezu optimale Kompression für große Dateien mit
stabilen statistischen Charakteristika zu schaffen.
Entwickler haben verschiedene Ansätze gewählt, um diese
konkurrierenden Designziele zu erfüllen, aber die Ergebnisse
ihrer Bemühungen sind nicht voll befriedigend gewesen.
-
Die Shannon Kommunikationstheorie (C. E. Shannon, "A
Mathematical Theory of Communcation", The Bell Technical
Journal, Vol XXVII, No. 3, 1948, S. 379-423 und No. 4, 1948,
S. 623-656) lassen erkennen, daß die ideale Codierung eines
gegebenen Quellsymbols einen Platz benötigt, der gleich log&sub2;
der Wahrscheinlichkeit P des Auftretens des Symbols ist. Wenn
sich die Codierung nach diesem speicherlosen Modell richtet,
ist der durchschnittliche Raum, der erforderlich ist, um
irgendein Symbol darzustellen, die Entropie der Quelle:
-
wobei: x ein zufällig gewähltes Symbol aus einer Quelle ist,
die n eindeutige Symbole umfaßt; und
-
c&sub1; sich über alle möglichen Quellsymbole erstreckt.
-
D.A. Huffman, schlägt in "A Method for the Construction of
Minimum Redundancy Codes", Proceedings of the I.R.E., Vol.
40, 1952, S. 1098-1110, ein Abbilden von Codes mit variabler
Länge auf die Quellsymbole gemäß der statistischen
Frequenzverteilung der Symbole vor, um eine diskrete
Approximation einer solcher idealen Codierung zu schaffen.
Danach wurden arithmetische Codiertechniken entwickelt, um
die Codierung durch das arithmetisches Modifizieren der
letzten Bits der zuvor codierten Symbole weiter zu
optimieren, wodurch die Verschwendung von fraktionalen Bits
vermieden wird. Siehe zum Beispiel R: C. Pasco, "Source
Coding Algorithms for Fast Data Compression", Ph.D.
Dissertation, Stanford University, 1976; G. G. Langdon, Jr.
et al., Compression of Black-White Images with Arithmetic
Coding", IEEE Transaatians an Communicatians, Com-29, No. 6,
1981, S. 858-867, G. G. Langdon, Jr. et al., "A Double
Adaptive File Compression Algorithm", IEEE Transaations an
Communications, Com-31, No. 111 1983, S. 1253-1255; und J.
Rissanen et al., "Universal Modeling and Coding", IEEE
Transactions an Information Theory, IT-27, No. 1, 1981, S.
12-23.
-
In der Praxis ist allerdings das Entropiemadell nullter
Ordnung aus Gleichung (1) nicht in der Lage, einen
signifikanten Teil der Redundanz vieler herkömmlicher Quellen
zu erringen. Beispielsweise zeigt ein Text in englischer
Sprache normalerweise einen wesentlichen Abfall in der
Entropie der ersten Ordnung:
-
wobei xy ein zufällig ausgewähltes Paar benachbarter
Quellzeichen ist.
-
Somit haben einigen der oben genannten Referenzen die
Huffman- und die arithmetische Codiertechnik dadurch
erweitert, daß die Codierung auf einer Statistik basiert, die
durch die Frequenz, bei der wenigstens eines und im
allgemeinen zwei oder mehr andere Symbole einem gegebenen
Symbol vorangehen, konditioniert ist. Unglücklicherweise
erfordert die erhöhte Kompression, die auf diese Weise
erzielt wird, charakteristischer Weise allerdings wesentlich
mehr Speicher und Prozeßzeit, um den Kompressiansprozeß
auszuführen.
-
Andere haben sog. "Textual-Substitution"-
Datenkompressionsverfahren bzw. Textsubstitution-
Datenkompressionsverfahren vorgeschlagen, um die Kohärenz
höherer Ordnung von Text und ähnlichen Quelldaten
einzufangen, ohne den Einfangmechanismus auf statistischen
Wahrscheinlichkeiten präkonditionieren zu müssen. J. Ziv und
A. Lempel haben ein algorithmisches Modell für einen
Textsubstitutionprozeß, der auf der Vorstellung basiert, daß
ein wiederholtes Auftreten einer Kette zuvor codierter
Symbole dadurch dargestellt werden kann, daß das Symbol, das
einem solchen wiederholten Auftreten unmittelbar folgt (d. h.
das Suffixzeichen der wiederholt auftretenden Kette) mit
einem Kopie-Codewort eingeleitet wird, das (1) auf ein Ende
(beispielsweise das führende Ende) des vorherigen Auftretens
der Kette zeigt, und (2) die Länge der wiederholt
auftretenden Kette identifiziert. Sie haben erkannt, daß ein
solches Kopie-Codewort die wiederholt auftretende Symbolkette
vollständig und gesamtheitlich definiert, so daß sie sich
eine "Substituierung" des Codewortes für die Symbole der
wiederholt auftretenden Symbolkette vorstellten, um eine
komprimierte Darstellung dieser zu schaffen. Siehe J. Ziv et
al., "A Universal Algorithm for Sequential Data Compression",
IEEE Transactions on Information Theory, IT-23, No. 3, 1977,
S. 337-343.
-
Bedauerlicherweise neigen Kompressionssysteme, die auf dem
ursprünglichen Ziv-Lempel Algorithmus basieren dazu, daß sie
unakzeptierbar langsam sind, und insbesondere keine hohe
Kompression erzielt haben. Um die Geschwindigkeit zu
verbessern, haben sie und andere, die in dem Gebiet tätig
sind, verschiedene Alternativen entwickelt. Einige dieser
Alternativen haben einen künstlichen Rigid-Parsing-
Mechanismus angenommen, um die Erzeugung von Kopie-Codeworten
zu vereinfachen und die Größe der Datenstrukturen, die
erforderlich sind, um die Kompression durchzuführen, zu
beschränken. Siehe beispielsweise J. Ziv. et al., supra; J.
Ziv, "Coding Theorems for Individual Sequences;" IEEE
Transactions on Information Theory, IT-24, No. 4, 1978, S.
405-412; J. Ziv et al., "Compression of Individual Sequences
Via Variable-Rate Coding", IEEE Transactions on Information
Theory, IT-24, No. 5, 1978, S. 530-536; and W. L. Eastman et
al., U. S. Patent 4,464,650, das am 7. August 1984 für einen
"Apparatus and Method for Compression Data Signals and
Restoring the Compressed Data" erteilt wurde. Allerdings sind
diese modifizierten Datenkompressionssysteme vom Ziv-Lempel-
Typ nicht vollständig befriedigend gewesen, da ihre
Leistungsfähigkeit typischerweise enttäuschte, wenn sie durch
die Geschwindigkeit, bei der sie Adaptieren und/oder durch
die Kompression, die sie lieferten, gemessen wurde.
-
Ein etwas unterschiedlicher Ansatz, der zur Verwendung von
Textsubstitution bei der Datenkompression vorgeschlagen
worden ist, basiert auf einem Aufbauen einer adaptiven Liste
oder eines Wörterbuchs individueller Symbole und
Symbolketten. Siehe beispielsweise V.S. Miller et al.,
"Variations on a Theme by Ziv and Lempel", IBM Research
Report, RC 10630, #47798, 1984, Combinational Algorithms on
Words, NATO, ASI Series F, Vol. 12, 1985, S. 131-140; T.A.
Welch, "A Technique for High Performance Data Compression",
IEEB Computer, Vol. 17, No. 6, 1984, S. 8-19; und J.L.
Bonkley, "A Locally adaptive Data Compression Scheme",
Communications of the ACM, Vol 29, No. 4, 1984, S 320-330.
Diese Systeme sind allerdings langsam beim Adaptieren und
liefern nur eine mindere Kompression.
-
Weitere Hintergrundinformation über das Gebiet digitaler
Datenkompression vom Textsubstitutionstyp ist beispielsweise
in M. Rodeh et al., "Linear Algorithm for Data Compression
Via String Matching", Journal of the Association for
Computing Machinery, Vol 28, No. 1, 1981, S. 16-24; J. A.
Storer, "Data Compression Via Textual Substitution", Journal
of the Association for Computing Machinery, Vol., 29, No. 4,
1982, S. 928-951; G. Guoan et al., "Using String Matching to
Compress Chinese Characters", Stanford Technical Report,
STAN-CS-82-914, 1982; and G. G. Langdon, Jr., "A Note on the
Ziv-Lempel Model for Compressing Individual Sequences", IEEE
Transaations on Information Theory, IT-29, No. 2, 1983, S.
284-287 gegeben.
-
Von Bell ist in IEEE Trans Communications, Vol., COM-34, No.
12, S. 1176-1182 ein Original Painter Makro offenbart, das
auf eine Datenkompressionstechnik mit linken Pointern (OPM/L)
zur Anwendung auf Textkompression beschränkt ist, in dem ein
binärer Suchbaum verwendet wird, um die längste
Kettenübereinstimmung zu finden.
-
Angesichts der Nachteile des Standes der Technik ist es
offensichtlich, daß immer noch das Erfordernis nach
praktischen adaptiven und invertierbaren (d. h.
verlust freien) Datenkompressionssystemen für allgemeine
Zwecke besteht, um verläßlich und effizient große Quellen,
die stabile statistische Charakteristika haben, sowie weniger
extensive Quellen und Quellen mit variablen statistischen
Charakteristika zu komprimieren. Textsubstitutionstechniken
wären für diese Aufgabe sehr gut geeignet, allerdings werden
verbesserte Methoden und Einrichtungen zur Durchführung eines
solchen Datenkompressionsprozesses in der Praxis benötigt, um
ihre Möglichkeiten vollständiger zu realisieren.
-
Gemäß der vorliegenden Erfindung wird ein
Datenkompressionsprozeß zum Konvertieren einer Sequenz von
Datenwerten in eine Sequenz von Literaldatenwerten und Kopie-
Codeworten gemäß einer vorbestimmten Strategie geschaffen,
die bestimmt, wann Kopie-Codeworte anstelle von Literalwerten
verwendet werden, dadurch gekennzeichnet, daß Kopie-Codeworte
Codeworte variabler Länge sind, die sich nach einem
monadischen Start-Schritt-Stop-Code richten, und daß jedes
Codewort aus einem Datenfeld-Längedeskriptor und einem
Datenfeld mit einer Bitlänge, die durch den Datenfeld-
Längedeskriptor spezifiziert ist, zusammengesetzt ist.
-
Diese und andere Merkmale und Vorteile der vorliegenden
Erfindung werden offensichtlich, wenn die folgende
detaillierte Beschreibung im Zusammenhang mit den beigefügten
Zeichnungen gelesen wird, in denen:
-
Fig. 1 ein vereinfachtes Blockdiagramm des
Datenkompressionssystems ist;
-
Fig. 2 ein Diagramm ist, das die Codierung einer Kette
eines Beispielstexts gemäß einer grundlegenden
Ausführungsform der vorliegenden Erfindung
darstellt;
-
Fig. 3 ein detaillierteres Blockdiagramm einer
Datenkompressionseinrichtung ist, die zur
Durchführung der in Fig. 2 dargestellten Codierung
ausgelegt ist;
-
Fig. 4 ein Blockdiagramm einer Expansionseinrichtung zum
Dekomprimieren der Daten, die durch die in Fig. 3
gezeigte Kompressionseinrichtung komprimiert worden
sind, ist;
-
Fig. 5 das Symbol-für-Symbol-Parsing einer Beispiel-
Symbolkette darstellt;
-
Fig. 6A
bis 6E diagrammatisch den Aufbau einer in einem Trie-
Suchbaum organisierten Datenstruktur darstellt;
-
Fig. 7A
bis 7E diagrammatisch den Aufbau einer in einem PARTICIA-
Baum organisierten Datenstruktur darstellt;
-
Fig. 8 diagrammatisch eine Suffixbaum-Organisation der in
Fig. 7E gezeigten Datenstruktur darstellt;
-
Fig. 9 eine verallgemeinerte Darstellung eines Suffixbaums
ist;
-
Fig. 10 ein schematisches Blockdiagramm einer
Kompressionseinrichtung mit einem monadischen
Codierer ist;
-
Fig. 11 ein Finite-State-Diagramm zur Darstellung des
Betriebs des in Fig. 10 gezeigten monadischen
Codierers ist;
-
Fig. 12 ein vereinfachtes Flußdiagramm für eine
Textsubstitition-Kompressionseinrichtung ist, die
komprimierte verschiebungen verwendet oder einen
Baumstrukturcodierer aufweist;
-
Fig. 13 ein vereinfachtes Flußdiagramm eines
Baumstrukturcodierers der in Fig. 12 gezeigten
Kompressionseinrichtung ist;
-
Fig. 14 ein vereinfachtes Flußdiagramm eines Flush- und
Pad-Unterprogramms zur Wortausrichtung der
komprimierten Ausgabe des in Fig. 12 gezeigten
Kompressors ist; und die
-
Fig. 15A
bis 15B sich zur Bildung eines vereinfachten Flußdiagramms
einer Expansionseinrichtung für die in den Fig.
12-14 gezeigte Kompressionseinrichtung
zusammenschließen.
-
Während die Erfindung im folgenden im Detail unter Bezugnahme
auf bestimmte dargestellte Ausführungsformen beschrieben ist,
ist es offensichtlich, daß damit nicht beabsichtigt ist, sie
auf diese Ausführungsformen zu beschränken. Im Gegenteil ist
es das Ziel, alle Modifikationen, Alternativen und
Äquivalente abzudecken, die in den Rahmen der Erfindung, wie
sie durch die beigefügten Ansprüche definiert ist, fallen.
A. Überblick
-
Nimmt man nun auf die Zeichnungen Bezug und an diesem Punkt
insbesondere auf Fig. 1, ist dort ein Datenkompressionssystem
61 mit einer Kompressionseinrichtung 62 zum Komprimieren
serieller digital codierter Quelldaten und eine
Expansionseinrichtung 63 zum seriellen Dekomprimieren der
Daten vorgesehen. Verschiedene Ausführungsformen der
vorliegenden Erfindung werden beschrieben und andere werden
von selbst nahegelegt, allerdings schafft jede von diesen ein
invertierbares oder verlustfreies Kompressionssystem, wodurch
sichergestellt wird, daß die expandierten oder
dekomprimierten Daten im wesentlichen mit den originalen
Quelldaten identisch sind. Außerdem sind alle
Ausführungsformen dieser Erfindung adaptiv, so daß die
Quelldaten beispielsweise aus alphanumerischem Text,
eingescannten oder synthetischen Bildern, menschen- oder
maschinenlesbaren Computercode oder verschiedenen
Kombinationen aus diesen und/oder anderen Quelltypen
zusammengesetzt sein können.
-
Zu Anfang ist offensichtlich, daß die Kompressionseinrichtung
62 und die Expansionseinrichtung 63 mittels geeignet
konfigurierter Hardware oder durch die Verwendung von
geeignet programmierten digitalen Computern für allgemeine
Zweck implementiertwerden können. Außerdem können die
Kompressioneinrichtung 62 und die Expansionseinrichtung 63 am
selben Ort lokalisiert sein, falls erwünscht ist, sie
beispielsweise zum Laden komprimierter Quelldaten auf und
Wiedergewinnung dekomprimierter Daten von einem Dateiserver
(nicht gezeigt) zu lokalisieren. In der Tat kann eine
Einzelort-Softwareimplementation der Kompressioneinrichtung
62 und der Expansionseinrichtung 63 denselben Computer zur
Ausführung des Kompressor- und des Expanderprogramms auf
Anforderung hin verwenden. Alternativ können die
Kompressionseinrichtung 62 und die Expansionseinrichtung 63
an verschiedenen Orten lokalisiert sein, wenn erwünscht ist,
ihre Funktionen, wie beispielsweise zum Übertragen und zum
Empfangen von Daten über ein Kommunikationsmedium mit
begrenzter Bandbreite (ebenfalls nicht gezeigt) zu verteilen.
Datei- und Stromkompressionseinrichtungen und
Expansionseinrichtungen werden diskutiert, so daß
offensichtlich ist, daß sich die Hauptunterschiede zwischen
beiden auf die Flußsteuerung ihrer Eingabedaten und auf das
Auffüllen der komprimierten Daten mit Pad-Codeworten bzw.
Auffüll-Codeworten zur Wiederherstellung ihrer
Byteausrichtung betreffen. Daten werden von dem "Klienten"
(wobei ein Kompressions-"Klient" eine Datenquelle und ein
Expansions-"Klient" eine Datensenke ist) in
Stromkompressionseinrichtungen "geschoben" und aus
Stromexpansionseinrichtungen "gezogen", wobei die Daten in
Dateikompressionseinrichtungen und Expansionseinrichtungen
unter ihrer internen Steuerung "geschoben" werden. Einige
beiläufige Verweise werden zum Auffüllen der komprimierten
Daten mit Pad-Codeworten gemacht, allerdings liegt dieses
Gebiet im allgemeinen außerhalb des Rahmens der vorliegenden
Erfindung und gehört zum Arbeitswissen eines
Durchschnittsfachmanns.
-
Um die vorliegende Erfindung auszuführen, assembliert die
Kompressionseinrichtung 62 einen vollständigen und aktuellen
Datensatz aller kürzlich komprimierter Quellsymbole, die
gemäß der Reihenfolge ihres Auftretens verbunden sind. Dieser
Datensatz wird in einem geeigneten Speicher gehalten, um ein
first in/first out ("FIFO") "Suchfenster" bzw. "Such-Window"
zu schaffen, das den Bereich aller zuvor komprimierten
Symbole in dem Quelldatenstrom zwischen der Position i des
zuletzt komprimierten Symbols und einer Position i-w eines
zuvor komprimierten Symbols überdeckt, wobei w die
Symbollänge des Suchfensters ist.
-
Im Betrieb werden die Quellsymbole überprüft, bevor sie in
das Suchfenster eingesetzt werden, um zu bestimmen, ob das
Suchfenster Übereinstimmungen für eine der erweiterten
Symbolketten, die durch Anfügen eines Testsymbols an der
Symbolposition i+1 mit einem oder mehreren der Symbole, die
diesem folgen, enthält, und falls dies so ist, um die
Symbollänge der längsten dieser Übereinstimmung zu bestimmen.
Falls keine übereinstimmung gefunden wird, oder falls die
längste existierende Übereinstimmung zu kurz ist, um ein
vorbestimmtes Kriterium einer "minimalen sinnvollen
Kopielänge" zu erfüllen, setzt die Kompressionseinrichtung 62
das Testsymbol in den komprimierten Datenstrom hinter ein
Literal-Codewort mit fester oder variabler Länge ein, das die
allgemeine Form "Literal xi" hat. Die Expansionseinrichtung
63 interpretiert dieses Codewort dahingehend, daß sie
angewiesen wird, das nächste "xi" Symbol direkt an ihren
Ausgang zu geben. Falls andererseits das Suchfenster eine
hinreichend lange übereinstimmung für eine solche erweitere
Testsymbolkette enthält, sucht die Kompressionseinrichtung 62
weiter Symbol-für-Symbol in dem unkomprimierten Datenstrom,
bis sie entweder (1) auf ein Symbol trifft, das die längste
existierende Übereinstimmung abbricht (d. h., ein Symbol, das
eine weitere Ausdehnung der Länge der Übereinstimmung nicht
erfüllt), oder (2) bestimmt, daß eine maximal erlaubte
Übereinstimmungslänge gefunden worden ist. Als Antwort auf
eine dieser Ereignisse, setzt die Kompressionseinrichtung 62
ein Kopie-Codewort mit fester oder variabler Länge der
allgemeinen Form "copy xc,-y" in den komprimierten Datenstrom
anstelle der übereinstimmenden Symbolkette. Dieses Codewort
weist die Expansionseinrichtung 63 an, über "y" zuvor
komprimierte Quellsymbole zurückzuspringen, wobei y ≤ w, und
dann "xc" aufeinanderfolgende Symbole von aufsteigend
jüngerem Alter in ihre Ausgabe zu kopieren, wobei der
Kopierprozeß mit dem Symbol der Sprungeintrittsposition
begonnen wird.
B. Eine elementare Ausführungsform
Offensichtlich ist, daß die erhaltene Kompression von dem
Raum, der für die Kopie- und die Literal-Codeworte
erforderlich ist, abhängt. Fig. 2 stellt eine
Einzeldurchlaufkompression eines bekannten Textabschnitts
dar, die acht und sechzehn Bit Literal- bzw. Kopie-Codeworte
mit fester Länge verwendet. Während die Längen dieser
Codewörter kein fundamentales Merkmal der vorliegenden
Erfindung sind, ist es klar, daß diese bestimmten Codewörter
hinreichend für eine praktische Implementierung dieser
Erfindung sind und den Vorteil einer Byteausrichtung mit den
Quelldaten, die aus herkömmlichen acht Bit pro Zeichentext
und/oder Computerquellcode zusammengesetzt sind.
-
Betrachtet man für einen Moment das Layout der Codewörter,
sieht man, daß die ersten vier Bitpösitionen eines acht Bit
Literal-Codewortes typischerweise einem Literalflag oder
Identifikationsfeld LF zugeteilt sind, um eine reservierte
Eingangsbitsequenz, wie beispielsweise "0000" zur eindeutigen
Identifizierung des Literal-Codewortes unterzubringen. In
diesem Fall liegen die anderen oder letzten vier Bits eines
derartigen Codewortes in einem Literallängen-Feld LL zum
Codieren einer Literallänge xi in dem Bereich [1 ... 16],
wobei bis zu sechzehn Literal-Symbole an ein solches Codewort
(d. h. die "maximal erlaubte Literallänge") angehängt werden
können. Ein Kopie-Codewort enthält andererseits sowohl eine
Kopielänge als auch einen Verschiebungs- oder
Speicherstellenwert. Hier sind beispielsweise die ersten vier
Bitpositionen eines jeden Kopie-Codewortes einem Kopielängen-
Feld CL zum Codieren einer Kopielänge xc in dem Bereich [2
... 16], zugeteilt, während seine verbleibenden oder letzten
zwölf Bit-Positionen ein Kopieverschiebungs-Feld CD zum
Kopieren einer Verschiebung y in dem Bereich [1 ... 4096]
bilden. Deshalb können bis zu sechzehn Symbole durch ein
Einzelkopie-Wort repräsentiert werden, wodurch die "maximal
erlaubte Kopielänge" (dies ist eine Anzahl von Ereignissen,
in denen Codes geeignet um 1 nach unten verschoben werden, so
daß ein Code mit einem Binärwert von 1 eine Kopielänge von 2
bedeutet, ein Code mit einem Binärwert von 2 eine Kopielänge
von 3 bedeutet, etc). definiert wird. Außerdem wird die
effektive Länge des Suchfensters bestimmt, weil der Ursprung
einer übereinstimmenden Symbolkette nur eindeutig
identifizierbar ist, wenn er eine von 4096 zuletzt
verarbeitenden Symbolpositionen ist.
-
Um das Beispiel, das in Fig. 2 gezeigt ist, zu vereinfachen,
ist es angenommen worden, daß das Suchfenster der
Kompressionseinrichtung 62 anfänglich leer ist und von
hinreichender Länge ist, um alle alphanumerischen Zeichen,
Satzzeichen und Zwischenräume des Beispieltexts (d.h. alle
seine "Quellsymbole") zu speichern. Ein vereinfachtes
Computerprogramm zum Komprimieren und Expandieren der
Quelldaten gemäß einer Ausführungsform dieser Erfindung ist
in Anhang A dargelegt, (wobei einige der einfachen Prozeduren
lediglich funktionell beschrieben sind)
-
Wie zu sehen ist, legt die Ausführungsform gemäß Anhang A der
Erfindung dem Betrieb der Kompressionseinrichtung 62 die
folgenden logischen Regeln auf: (1) falls die
Kompressionseinrichtung 62 bereit ist, und falls die längste
Übereinstimmung, die innerhalb des Suchfensters für ein
gegebenes Testsymbol gefunden worden ist, wenn es um ein oder
mehrere der Symbole, die ihm folgen, erweitert ist (d. h.
eine erweiterte Testsymbolkette ist), weniger als zwei
Symbole lang ist, wird ein "Literal" initiiert; (2) wenn es
einmal initiiert ist, wird ein Literal nicht unterbrochen,
bevor es seine maximale erlaubte Länge annimmt, es sei denn
eine Anpassungsspanne von wenigstens drei Symbolen wird
gefunden; (3) eine "Kopie" wird initiiert (i) in dem Fall
eines derartigen Interrupts oder (ii) falls die
Kompressionseinrichtung 62 bereit ist und eine
Anpassungsspanne von wenigstens zwei Symbolen gefunden wird;
(4) ein Literal-Codewort und die Literal-Quellsymbole, die an
ihm angehängt sind, werden in den komprimierten Datenstrom
eingesetzt, immer wenn (i) ein Literal unterbrochen wird,
oder (ii) ein Literal von maximaler erlaubter Länge zur
verfügung steht; und (5) ein Kopie-Codewort wird in den
komprimierten Datenstrom eingesetzt, immer wenn bestimmt
wird, daß die übereinstimmende Eingangs- oder Testsymbolkette
(i) durch ein Symbol beendet wird, das die Länge der längsten
vorhandenen übereinstimmung nicht erweitert oder (ii) den
Bereich einer maximal erlaubten Kopielänge überdeckt. Die
Kommentare, die in dem Anhang erscheinen, werden helfen, die
vorangegangenen Regeln mit dem Code zu korrelieren. Außerdem
betrifft das Vorwort von Anhang A verschiedene Techniken, die
verwendet werden können, um die Ausführungsgeschwindigkeit
des Kompressionsprogramms zu erhöhen und die Menge an
Speicher, die zu seiner Ausführung erforderlich ist, zu
verringern.
-
Angesichts der vereinfachten Annahme, daß das Suchfenster der
Kompressioneinrichtung 62 anfänglich leer ist, ist es
offensichtlich, daß die oben zusammengefaßten
Kompressionsregeln bewirken, daß die Kompressionseinrichtung
62 die ersten paar Symbole des in Fig. 2 gezeigten
Beispieltexts an ein Literal-Codewort anhängt. In der Tat
erfordern in diesem Fall die Kompressionsregeln eine
Literalcodierung von Symbolen 1-26, so daß mehr Literale in
dieser ersten Symbolkette als in irgendeinem Literal-Codewort
maximal erlaubter Literallänge effektiv an die
Expansionseinrichtung 63 kommuniziert werden können. Ein
Auftreten einer solchen Situation von Zeit zu Zeit ist
wahrscheinlich, insbesondere während des Anlaufens und
während die Kompressionseinrichtung 62 von einem Typ
Quelldaten zu einem anderen übergeht, so daß es wichtig ist,
zu verstehen, daß die Kompressionseinrichtung 62 immer, wenn
sie eine Literal-Symbol-Kette mit maximal erlaubter
Literallänge zusammensetzt, wiederholt durchläuft bzw.
recyclet. Als Ergebnis dieses wiederholten Durchlaufs
unterteilt die Kompressionseinrichtung 62 längere Literal-
Symbol-Ketten in zwei oder mehr Unterketten von erlaubter
Länge und fügt diese Unterketten an getrennte Literal-
Codeworte, um sie der Expansionseinrichtung 63 zuzuführen.
Beispielsweise werden die Symbole 1-16 des in Fig. 2
dargelegten Texts an ein erstes Literal-Codewort mit einem
Längenwert von sechzehn angehängt, und dann werden die
Symbole 17-26 an ein zweites Literal-Codewort mit einem
Längenwert von zehn angehängt. Es ist offensichtlich, daß es
ein Vorteil dieser längeren Literale ist, daß sie die Anzahl
der Literal-Codeworte, die in den komprimierten Datenstrom
eingesetzt werden, während die Kompressionseinrichtung an
einen neuen Quelldatentyp angepaßt wird, effektiv verringern.
-
Während sich das Symbol 27 des Textes in Fig. 2 in der
Symbolposition i+1 befindet, wird eine drei Symbol lange
Übereinstimmung gefunden, weil die Symbole 27-29 mit den
vorher aufgetretenen Symbolen 1-3 übereinstimmen.
Konsequenterweise wird das "Literal", das dann in
Verarbeitung ist, unterbrochen und eine "Kopie" wird
initiiert. Dies ist das erste Auftreten von "Kopie" in diesem
speziellen Beispiel, obwohl ein kurzer Überblick über den
Beispieltext vorherige zwei Symbol lange Übereinstimmungen
ergibt. Es ist deshalb klar, daß diese vorherigen
Übereinstimmungen beim Einhalten der Kompressionsregeln von
Anhang ignoriert worden sind, weil jede nur zwei Symbole lang
war, und aufgetreten ist, während ein Literal erzeugt worden
ist.
-
Nachdem eine "Kopie" als Antwort auf die für die Symbole 27-
29 gefundene Übereinstimmung initiiert worden ist, erweitert
die Kompressionseinrichtung 62 weiterhin die übereinstimmende
Symbolkette mit aufeinanderfolgenden der folgenden
Quellsymbole bis sie ein Quellsymbol findet, das die
Übereinstimmung abbricht, (d. h. ein Symbol, das nicht in der
Lage ist, die Länge der längsten Übereinstimmung weiterhin zu
erweitern), wie bei Symbol 38, oder bis es eine
Übereinstimmung maximal zulässiger Kopielänge findet. Wenn
eines dieser Ereignisse auftritt, gibt die
Kompressionseinrichtung 62 anstelle der übereinstimmenden
Symbolketten ein Kopie-Codewort in den komprimierten
Datenstrom. Das Kopie-Codewort zeigt die Länge dieser
Symbolkette an und schafft einen Zeiger bzw. Pointer zur
Lokalisierung des führenden Symbols des vorherigen
Auftretens, wodurch die Expansionseinrichtung 63 in der Lage
ist, die Symbole, die durch die Codeworte dargestellt sind,
mittels des zuvor beschriebenen "Rücksprung"- und
"Vorwärtskopier"-Prozesses wiederzugewinnen.
-
Bezug nehmend auf Fig. 3 umfaßt die Ausführungsform des
Kompressors 62 nach Anhang A einen first in/first out (FIFO)
Eingabepuffer 71 zum Speichern (1) von Symbolen von einem zu
komprimierenden Abschnitt der Quelle in Symbolpositionen, die
bis zu einer Symbolposition i+1 laufen und diese
einschließen, denen (2) die kürzlich komprimierten Symbole in
dem Suchfenster-Symbolpositionen i bis i-w vorangehen. In
einer Software-Implementation ist der Puffer 71 geeigneter
Weise ein Zirkularpuffer, der in Quadranten geteilt ist, so
daß eine Stapeltransaktion zum regulären Quadrant-für-
Quadrant-Wiederladen von Quellsymbolen in ihn, bis die zu
komprimierende Quelle erschöpft ist (d. h. bis das Ende der
aktuellen Quelldatei erreicht ist), ausgeführt werden kann.
Dies reduziert die Anzahl von I/O-Transaktionen, die
erforderlich sind, um einen zeitlichen Fluß der Quellsymbole
zur Kompressioneinrichtung 62 aufrechtzuerhalten. In einer
solchen Implementierung werden die Quadranten so ausgewählt,
daß sie hinreichend groß sind, um die durch die
Kompressionseinrichtung 62 durchgeführte Kompression von dem
Wiederladen in ihren Eingabepuffer 71 effektiv zu isolieren.
-
Eine Such- und Aktualisierungslogikschaltung 72 setzt eine
nach einem Suchbaum organisierte Datenstruktur 73 zusammen
und erhält sie aufrecht, welche die Symbole innerhalb der
Symbolpositionen i bis i-w des Puffers 71 (d. h. des
Suchfensters) miteinander gemäß der Reihenfolge des
Auftretens verbindet, und den jüngsten Auftritt dieser
Symbolketten verfolgt, wenn aufeinanderfolgende Symbole in,
durch und aus dem Suchfenster geschoben werden. Die Cutoff-
Tiefe der Verbindungen, die durch die Suchbaum-Datenstruktur
73 gegeben sind, werden geeigneter Weise so ausgewählt, daß
sie gleich der maximal erlaubten Kopielänge sind, wodurch die
Menge an Speicher, der erforderlich ist, um sie zu speichern,
und die Prozeßzeit, die erforderlich ist, um sie
aufrechtzuerhalten, beschränkt werden. Einige andere
Techniken, die zur weiteren Verringerung der Größe des
Suchbaums 73 verwendet werden können, und die Zeit, die
erforderlich ist, um ihn zu aktualisieren, werden im
folgenden in detaillierter beschrieben.
-
Im Betrieb verwendet die Such- und Aktualisierungslogik 72
den Suchbaum 73 um zu bestimmen, ob es eine Übereinstimmung
irgendwo innerhalb der Symbolposition i bis i-w des Puffers
71 für das Testsymbol, das an der Symbolposition i+1
erscheint, vorhanden ist. Falls eine übereinstimmung gefunden
worden ist, erweitert die Logikschaltung 72 die Testkette
durch Anhängen des Symbols an der Symbolposition i+2, und
bestimmt dann, ob außerdem eine Übereinstimmung innerhalb des
Suchfensters für diese erweiterte Eingabesymbolkette
vorliegt. Dies ist ein sich wiederholter Prozeß, wodurch die
Such- und Aktualisierungslogikschaltung 72 zunehmend die
Testsymbolkette durch Erweitern derselben mit einem
unkomprimierten Symbol nach dem anderen ergänzen, bis ein
Symbol, das die Länge der längsten existierenden
Übereinstimmung nicht verlängern kann (d. h. ein
Übereinstimmungsabbruchsymbol) angetroffen wird oder bis die
Existenz einer Ubereinstimmung mit maximal erlaubter
Kopielänge identifiziert wird. Wenn eines dieser beiden
Ereignisse auftritt, gibt die Such- und Aktualisierungslogik
72 einen Bericht an einen Diskriminator 74, der gemäß den
oben zusammengefaßten Codierregeln betrieben wird, um zu
bestimmen, ob das Symbol oder die Symbole, die getestet
werden, als Kopie-Codewort durch einen Kopie-Codierer 75
codiert werden sollen oder an ein Literal-Codewort durch
einen Literal-Codierer 76 angefügt werden sollen. Am Ende
identifiziert der Bericht, der durch die Such- und
Aktualisierungslogikschaltung 72 geliefert wird, die Länge
der längsten Übereinstimmung, die gefunden worden ist, und
die Suchfensterposition des vorherigen Auftretens der
übereinstimmenden Symbole (die Positionsinformation muß nicht
berichtet werden, falls die Länge der Übereinstimmung weniger
als die minimale Übereinstimmungslänge, die für eine Kopie
erforderlich ist, beträgt). In diesem Fall wird die Stelle
des führenden oder ersten Symbols der übereinstimmenden
Symbolkette an den Kopie-Codierer 75 als Verschiebung von der
Symbolposition i+1 berichtet, aber es ist offensichtlich, daß
seine Stelle auf andere Weisen eindeutig bestimmt werden
kann.
-
Ein Kopie-Codewort wird durch den Kopie-Codierer 75 in einen
Ausgabepuffer 77 als Antwort auf einen Bericht von der
Such- und Aktualisierungslogikschaltung 72 eingesetzt, was bewirkt,
daß der Diskriminator 74 zu dem Schluß kommt, daß eine
Übereinstimmung von hinreichender Länge, die durch ein
solches Codewort codiert werden soll, identifiziert worden
ist. Das Kopie-Codewort wird für die Symbole der
übereinstimmenden Symbolkette substituiert, so daß alle
Symbole der übereinstimmenden Symbolketten in den
Suchfensterquadranten oder den Sektor des Puffers 71
verschoben werden, bevor der Diskriminator 74 auf einen
weiteren Bericht von der Such- und
Aktualisierungslogikschaltung 72 antwortet. Zu diesem Zweck
wird ein Zählwert, der der Länge jeder Kopie entspricht, in
einen Zeichenübersprung-Zähler eines zählergesteuerten Gates
78 zur temporären Abschaltung der Codierlogikschaltung 74-76
vom Erzeugen weiterer Codeworte geladen, während die Symbole,
die durch die Kopie dargestellt werden, in den
Suchfenstersektor des Eingabepuffers 71 geladen werden. Die
Zählung wird dekrementiert, wenn jedes der
aufeinanderfolgenden Symbole in der übereinstimmenden
Symbolkette in das Suchfenster geladen wird, so daß die
Codierung mit dem Symbol, das der übereinstimmenden Kette
folgt, fortfährt.
-
Ein Literal wird andererseits durch den Diskriminator 74
initiiert, wenn die Such- und Aktualisierungslogikschaltung
72 nicht in der Lage ist, eine Übereinstimmung von
hinreichender Länge, die als Kopie zu codieren ist, zu
finden, sogar wenn die Länge des Literais noch unbekannt ist.
Wenn ein Literal einmal initiiert worden ist, prüft die
Such- und Aktualisierungslogikschaltung 72 die Erweiterungen von
aufeinanderfolgenden der unkomprimierten Symbole, wenn sie in
die Symbolpositionen i+1 geschoben werden, bis sie eine
Übereinstimmung für eine erweitere Testsymbolkette von
hinreichender Länge findet, um eine Unterbrechung des
Literals zu garantieren (d. h. wenigstens drei Symbole lang)
oder bis die Anzahl von Symbolen, die getestet worden sind,
die maximal erlaubte Literallänge erreicht. Immer wenn eines
dieser Ereignisse auftritt, setzt der Literal-Codierer 76 ein
Literal-Codewort, das die Länge des Literals identifiziert,
in den Ausgabepuffer 77 ein, und kopiert dann in serieller
Reihenfolge die angesammelten Symbole des Literals in den
Puffer 77, wodurch sie alle an das Literal-Codewort angehängt
werden. Das Literal-Codewort und die an ihm angehängten
Literal-Symbole können in den Ausgabepuffer 77 geladen
werden, sobald eine übereinstimmung von hinreichender Länge
für eine Kopie gefunden worden ist, oder wie in den
dargestellten Ausführungsformen, nachdem die Übereinstimmung
für die Kopie auf seine größte Länge erweitert worden ist, so
daß der Kopie-Codierer 75 bereit ist, ein Kopie-Codewort
auszugeben.
-
Wie in Fig. 4 gezeigt, umfaßt die Expansionseinrichtung 63
zum Dekomprimieren der komprimierten Quelldaten einen
Eingabepuffer 81 zur Lieferung der komprimierten Daten an
einen Decoder 82 mit einer geeigneten Rate oder wie sie
angefordert werden. Der Decoder 82 decodiert seinerseits die
Literal- und Kopie-Codeworte für eine Literallogikschaltung
83 bzw. eine Codierlogikschaltung 84. Wenn ein Literal-
Codewort durch den Decoder 82 decodiert worden ist, antwortet
die Literallogikschaltung 83 auf die decodierte Länge des
Literals xi, so daß das die nächsten xi Symbole direkt
seriell in einen FIFO-Ausgabepuffer 85 geladen wird.
Andererseits antwortet, wenn ein Kopie-Codewort decodiert
worden ist, die Codierlogikschaltung 84 auf seine
Verschiebung y und die Länge xc, um in den Ausgabepuffer 85
eine Kette vorher dekomprimierter Symbole seriell zu
kopieren, wobei mit dem y-ten zuvor dekomprimierten Symbol in
dem Puffer 85 begonnen wird und die Kopie von dort aus durch
eine Kette von xc fortwährend jüngeren dekomprimierten
Symbolen erweitert wird.
C. Weiteres zu Suchbäumen
-
Vorteilhafter Weise verzweigt der Suchbaum 73 mit den
"Ziffern" seiner Schlüssel zu seinen "Blättern", die durch die
Quellsymbole, die innerhalb der Symbolpositionen i bis i-w
des Suchfensters des Eingabepuffer 71 zu einer gegebenen Zeit
definiert sind. Betrachtet man beispielsweise den hochgradig
redundanten Text in englischer Sprache, der in Fig. 5 gezeigt
ist, wird es offensichtlich, daß ein Suchbaum 73, der gemäß
den individuellen Zeichen eines Abschnitts des Textes, der
innerhalb der Suchfenster-Symbolpositionen des Eingabepuffers
71 ist, sehr gut geeignet, um die Zeiger zu liefern, die
erforderlich sind, um vorheriges Auftreten der wiederholt
auftretenden Symbole und Symbolketten zu lokalisieren,
vorausgesetzt, daß die Zeiger während des Betriebs
aktualisiert werden, um die FIFO-Verschiebung der
komprimierten Quellsymbole in, durch und aus dem Suchfenster
zu berücksichtigen. Symbole werden in das Fenster über eine
Symbolposition i geschoben, kurz nachdem bestimmt worden ist,
ob sie mit einem Literal- oder Kopie-Codewort zu verbinden
sind, wie dies vorher beschrieben worden ist, während ältere
Symbole aus dem Fenster über die Symbolposition i-w geschoben
werden, wenn der von ihnen eingenommene Raum zur Speicherung
der jüngeren komprimierten Symbole und Symbolketten benötigt
wird. Obwohl die relative Bewegung zwischen den Quellsymbolen
und dem Suchfenster mit fester Länge am einfachsten als
physikalisches Verschieben der Symbole in bezug auf das
Suchfenster dargestellt werden kann, ist es offensichtlich,
daß sie in Softwareform durch das Verwenden von Zeigern, die
in bezug auf die Quellsymbole unter Softwaresteuerung
verschoben werden, implementiert werden kann.
-
Bezug nehmend auf die Fig. 6A-6E ist es offensichtlich, daß
eine Trie-Baumdatenstruktur (siehe D. E., Knuth, The Art of
Computer Programming, Vol 3: Sorting and Searching, Addison-
Wesley, Zweiter Druck, 1975, S. 481) die funktionellen
Grunderfordernisse des Suchbaums 73 erfüllt. Wie bekannt ist,
wird eine Symbolkette in einen Trie-Baum dadurch eingesetzt,
daß von der Wurzel des Baums eine zusätzliche Stufe für jedes
nachfolgende Symbol in der Kette abgestiegen wird.
Konsequenterweise verzweigt die j-te Stufe des Baums gemäß
dem j-ten Symbol in einer gegebenen Symbolkette mit dem
Ergebnis, das der Baum inhärent alle notwendigen Zeiger
enthält, um alle Symbole und Symbolketten innerhalb des
Suchfensters zu lokalisieren. Allerdings ist eine wesentliche
Menge an Prozeßzeit erforderlich, um die Symbolketten in
einen Trie-Baum einzusetzen (d. h. der schlimmste Fall für
eine Einsetzzeit für eine Datei, die aus n Symbolen besteht,
O(d n), wobei d die maximal zulässige Kopielänge ist).
Außerdem wächst die Größe einer solchen Datenstruktur auf O(d
w), wobei w die Suchfenstergröße ist, so daß eine einfache
Trie-Baumdatenstruktur wahrscheinlich für die meisten
praktischen Anwendungen dieser Erfindung zu groß ist.
-
Bezug nehmend auf die Fig. 7A-7E, ist ein PATRICIA-Baum
(siehe D.R. Morrison, "PATRICIA-Practical Algorithm to
Retrieve Information Coded in Alphanumeric", Journal of the
Association for Computing Machinerv, Vol 15, No. 4, 1968 S.
513-534) eine relativ kompakte Alternative zu dem Trie-Baum.
-
Wie bekannt ist, umfassen die internen Knoten eines PATRICIA-
Baumes Zeiger zur Datei, welche er indiziert, so daß die
Datenstruktur eines solchen Baums nur eine einzelne "ziffer"
oder Symbol für jede Suchwegverzweigung umfassen muß, wodurch
die überflüssigen internen Knoten eines Trie-Baums vermieden
werden (d. h. diejenigen mit lediglich einem Abstieg). Wenn
beispielsweise der Suchbaum 73 (Fig. 3) ein PATRICIA-Baum
ist, brauchen die Symbole, die auf seinen Arcs in den Fig.
7B-7E in Klammern dargestellt sind, nicht explizit in der
Datenstruktur eingeschlossen werden, weil sie das Verzweigen
des Baums nicht beeinflussen. Die Symbole können außerdem
durch Abtasten der Symbole innerhalb der
Suchfensterpositionen, die durch die Position und das Stufen-
Zeigerpaar der Knoten für die Arcs auf denen sie liegen,
identifiziert werden, wiedergewonnen werden, so daß sie
effektiv durch diese Arcs dargestellt werden.
-
Ein klassischer PATRICIA-Baum erfordert nur einen einzigen
Dateizugriff und einen Vergleich am Ende einer jede Suche.
Wenn allerdings ein Suchbaum vom PATRICIA-Typ 73 verwendet
wird, um die vorliegende Erfindung auszuführen, sind
vorzugsweise die Symbole, die durch die Arcs, die während dem
Einsetzen der Symbolketten in dem Baum gekreuzt werden,
abzutasten, so daß die Positionszeiger innerhalb der Knoten,
zu denen diese Arcs führen, aktualisiert werden können,
während in dem Baum nach unten abgestiegen wird.
Typischerweise sind die "Ziffern", die in den Suchbaum 73
eingesetzt werden, Bytes (d. h. acht Bitzeichen), so daß ein
Verzweigungsfaktor von 256 geschaffen werden kann. Als
allgemeine Regel haben die Knoten außerdem nicht derart viele
Abstiege, so daß die Menge an Raum, der innerhalb der Knoten
des Baums 73 reserviert werden muß, um das Verzweigen seiner
Suchpfade zu definieren, durch Hashen (Abbilden mit Hilfe der
Streuspiechertechnik) seiner Arcs verringert werden.
-
Ein PATRICIA-Baum ist eine akzeptierbare Wahl für den
Suchbaum 73, falls eine ausreichende Kompression erzielt
werden kann, während ein Suchbaum mit einer relativ flachen
Cutoff-Tiefe verwendet wird. Wie vorher dargelegt, ist ein
solcher Baum durch eine in vernünftigem Maße kompakte
Datenstruktur definiert, er beruht allerdings auf im
wesentlichen demselben Einsetzprozeß (d. h. Zurückkehren zur
Wurzel und dann Absteigen in den Baum) wie der Trie-Baum.
Konsequenterweise neigt die Zeit, die zum Einsetzen längerer
Symbolketten in einen PATRICIA-Baum erforderlich ist, die
praktischen Anwendungen dieses Baumtyps auf Ausführungen zu
beschränken, in welchen die maximal zulässige Kopielänge
relativ kurz ist (im schlimmsten Fall ist wiederum die
Einsetzzeit für eine Datei aus n Symbolen O(d n), wobei die
Tiefe d, die von dem Baum gefordert wird, gleich der maximal
zulässigen Kopielänge ist). Glücklicherweise kann ein leicht
modifizierter Suffixbaum, wie er beispielsweise in Fig. 8
gezeigt ist, für Ausführungsformen verwendet werden, in denen
es erforderlich oder wünschenswert ist, daß man in der Lage
ist, eine Symbolkette in den Suchbaum 73 (Fig. 3) in einer
O(n)-Zeit einzusetzen. Wie von E. M. McCreight, "A Space-
Economical Suffix Tree Algorithm", Journal of the Association
for Computing Machinery, Vol 28, No. 1, 1976, S. 262-272
beschrieben, ist ein Suffixbaum dem PATRICIA-Baum ähnlich mit
der Ausnahme, daß die internen Knoten eines Suffixbaums
Zeiger umfassen, die sie mit den Knoten ihrer Suffixe
verbinden, wie durch die gestrichelte Linie in Fig. 8 gezeigt
ist. Insbesondere sieht man, wenn man sich dem
verallgemeinerten Suffixbaum, der in Fig. 9 gezeigt ist,
zuwendet, daß seine internen Knoten für Suffix-erweiterte
Symbolketten, wie beispielsweise der Kette aX, Zeiger zu den
Knoten umfassen, die ihre Suffixerweiterungen, wie
beispielsweise x darstellen. Somit kann, falls eine
Suffixerweiterte Symbolkette, die an der Position p in dem
Suchfenster beginnt, gerade auf einer Stufe 1 eines Suchbaums
vom Suffixtyp 73 eingesetzt worden ist, die Kette, die an der
Position p+1 startet, in den Suchbaum eingesetzt werden, ohne
zu seiner Wurzel zurückzukehren, weil immer ein benachbarter
Suffixzeiger vorhanden ist, der von dem Knoten, der eine
Suffix-erweiterte Symbolkette darstellt (d. h. der Kette, die
an der Position p beginnt) zu dem Knoten für seine
Suffixerweiterung (d. h. der Kette, die an der Position p+1
beginnt) führt.
-
Betrachtet man Fig. 9 zusätzlich detaillierter, sieht man,
daß eine Situation dargestellt ist, in der eine
Übereinstimmung in der vorherigen Iteration für eine Kette
gefunden worden ist, die aus aXY zusammengesetzt ist, wobei a
ein einzelnes Symbol, X- und Y-Ketten sind, die aus einem
oder mehreren Symbolen zusammengesetzt sind, und b das erste
nicht übereinstimmende Symbol, das Y folgt, ist. Um eine
weitere Komplikation, die von Zeit zu Zeit auftritt, zu
illustrieren, ist angenommen worden, daß α ein neuer interner
Knoten ist, der gerade zu dem Baum hinzugefügt worden ist, um
zwischen dem Suchpfad für Kette axyb und dem Suchpfad für die
Kette aXYZ, wobei Z nicht mit b beginnt, zu diskriminieren.
Angesichts dieser Voraussetzung ist es offensichtlich, daß es
noch erforderlich ist, die Suffixverbindung für den Knoten α
zu berechnen.
-
Gemäß McGreight's oben dargestellter Lehre kann die nächste
Kette XYb durch anfängliches Aufwärtsbewegen auf dem Baum (d.
h. in Richtung seiner Wurzel) von dem Knoten α (der noch
keine Suffixverbindung hat) zu dem nächst h6heren Knoten β
eingesetzt werden, wodurch Y von der Kette aXY gezogen wird.
Der Knoten β stellt notwendigerweise die Kette aX dar, so daß
sein Suffixzeiger zu dem Knoten γ verfolgt wird, der per
Definition das Suffix X der Kette aX darstellt. Hat man den
Knoten, der X darstellt, gefunden, kann die Suffix-erweiterte
Symbolkette XYb nun durch Absteigen in den Baum eingesetzt
werden, um zuerst die Kette Y "wiederholt abzutasten" und
dann noch weiter in den Baum herab "abzutasten", um so die
längste existierende Übereinstimmung für die Symbolkette, die
mit der Unterkette XY beginnt, zu finden. Falls eine
existierende übereinstimmung für seine Suffixerweiterung XYb
vorhanden ist, bricht die "wiederholte Abtastung" an dem
Knoten δ ab, welcher der Unterkette xY entspricht. Wenn
andererseits keine Übereinstimmung für die Suffix-erweiterte
Kette XYb vorhanden ist, wird der Knoten δ durch Aufbrechen
eines Arcs, der eine Kette, die mit Y beginnt, darstellt,
erzeugt, so daß der neue Knoten δ mit Y, das durch seinen
einlaufenden Arc dargestellt ist, eingesetzt wird. In jedem
Fall verzweigt der Knoten δ zu dem Symbol b und stellt das
Suffix XY für die vorherige Symbolkette aXY dar. Somit tritt
ein Zeiger darauf in das Suffixverbindungsfeld des Knotens α
ein, wodurch die Invariante, daß mit der möglichen Ausnahme
eines jüngst erzeugten jeder interne Knoten innerhalb des
Suffixbaums eine Suffixverbindung hat, wiederhergestellt
werden.
-
Glücklicherweise müssen die Symbolketten, die durch die Arcs,
die während des oben beschriebenen Prozesses (d. h. der Kette
Y) "wiederholt abgetastet" werden, nicht mit den
entsprechenden Symbolen der Kette, die in den Baum eingesetzt
werden, verglichen werden, da die Identität dieser zwei
Symbolsätze während der vorherigen Iteration ausgebildet
wurde (d. h. während das Suffix XY der Symbolkette aXY in den
Baum eingesetzt worden ist) . Dieses vorherige Wissen erlaubt
es, Symbolketten in einen Baum vom Suffixtyp 73 mit im
wesentlichen linearer Zeit einzusetzen, da nur die jüngsten
Suffixerweiterungen mit dem Inhalt des Suchbaums verglichen
werden müssen.
-
Gemäß einem Merkmal dieser Erfindung können verschiedene
wichtige Modifikationen an der Datenstruktur des Suchbaums
vom Suffixtyp, beschrieben von Mcgreight supra, durchgeführt
werden, um seine Größe zu beschränken und die Zeit zur
Aufrechterhaltung desselben zu verringern. Wie vorher
dargelegt, werden die Blätter des Baums seriell in, durch und
aus den Suchfenster-Symbolpositionen i bis i-w des Puffers 71
(Fig. 3) auf einer FIFO-Basis geschoben, wodurch eine
geordnete Prozedur zur Aufrechterhaltung des jüngst
komprimierten Abschnitts der Quelldaten innerhalb des
Suchfensters mit fester Länge geschaffen wird. Außerdem
werden "Sohn-Zähl" bzw. "Son-Count"-Felder in den internen
Knoten des Baums zur Identifikation der Knoten, die gelöscht
werden sollen, eingeschlossen. Es ist offensichtlich, daß
interne Knoten zu dem Baum nur hinzugefügt werden, wenn sie
erforderlich sind, um zwischen alternativen Suchpfaden zu
diskriminieren. Ein "Eltern-Knoten", der lediglich einen
verbleibenden "Sohn" hat, schafft keine derartige
Suchpfaddiskriminierung. Somit wird, immer wenn der Wert in
dem Sohn-Zählfeld eines Knotens auf 1 abfällt, der Knoten
gelöscht und das Symbol oder die Symbolkette, die durch den
einzig verbliebenen oder "verwaisten" Sohn dargestellt wird,
wird mit dem Symbol oder mit der Symbolkette, die durch den
Arc von der nächsthöheren Stufe oder dem "Großeltern-Knoten"
dargestellt.
-
Eine weitere Abweichung von dem bekannten Suchbaum vom
Suffixtyp ist die Vorkehrung, die gemacht wurde, um die
Positionspointer in den internen Knoten des Suffixbaums zu
aktualisieren, ohne notwendigerweise eine Rückkehr zu der
Wurzel des Baums zu erfordern, um dies durchzuführen.
Insbesondere in Übereinstimmung mit einem der etwas
detaillierteren Merkmale der vorliegenden Erfindung kann eine
"Perkolationsaktualisierung" zum Aktualisieren der Zeiger in
den internen Knotens eines Suffixbaums verwendet werden,
wodurch diese Pomter auf den Suffixblättern des Baums
beibehalten werden, wenn die Blätter (d. h. die jüngst
komprimierten Quellsymbole) durch das Suchfenster geschoben
werden. Hierzu umfaßt jeder interne Knoten des Baums ein
einzelnes "Aktualisierungs"-Bit zusätzlich zu seinen zuvor
genannten Positions- und Stufenzeigern, dem Suffixzeiger und
dem Sohn-Zählfeld. Außerdem wird, immer wenn eine neue
Symbolkette in dem Baum eingesetzt wird, die aktuelle
Position in dem Abtastfenster des Anfangs- oder führenden
Symbols der Kette aufwärts an den Eltern-Knoten für die neuen
Blätter der gerade eingesetzten Symbolkette weitergegeben,
wodurch (1) die aktuelle Position des führenden Symbols des
jüngsten Auftretens der gegebenen Symbolkette in das
Positionsfeld seines Blatt-Eltern-Knotens gegeben wird, um
dieses Auftreten von irgendeinem vorherigen Auftreten
derselben Symbolkette, die noch innerhalb des Suchfensters
sein kann, zu unterscheiden, und (2) der Zustand des
Aktualisierungsbits für den Elternknoten des neuen Blatts
bzw. Leafs umgedreht wird. Falls das Aktualisierungsbit des
Elternknotens von einem "falsch"-Zustand in einen "wahr"-
Zustand geschaltet wird, gibt es keine weitere Propagation
der Positionsaktualisierung. Wenn allerdings das
Aktualisierungsbit des Elternknotens des neuen Blatts von
einem "wahr"-Zustand in einen "falsch"-Zustand geschaltet
wird, wird die aktuelle Suchfensterposition des führenden
Symbols der neu eingesetzten Symbolkette in dem Baum aufwärts
(zurück zu seiner Wurzel) propagiert, um das Positionsfeld
aller Knoten auf dem Suchweg für die Symbolkette zu
aktualisieren bis die Aktualisierung einen Knoten einer
höheren Stufe erreicht, der ein "falsch"-Aktualisierungsbit
aufweist. Dieser Aktualisierungsprozeß wird
"Perkolationsaktualisierung" genannt, da die Propagation der
Aktualisierung an dem ersten Knoten (dem Knoten mit der
niedrigsten Stufe), der eine Aktualisierung erfährt, während
sein Aktualisierungsbit in einer "falsch"-Zustand ist,
beendet wird. Das Positionsfeld eines solchen
Aktualisierungsabbruchknotens wird so aktualisiert, daß es
auf das führende Symbol der neu eingesetzten Symbolkette
zeigt, und das Aktualisierungsbit des Knotens wird in einen
"wahr"-Zustand geschaltet, wodurch der Knoten so
konditioniert wird, daß er die nächste Aktualisierung, die er
erfährt, an seinen Eltern-Knoten propagiert. Schließlich wird
das letzte Symbol der neu eingesetzten Symbolkette in das
Suchfenster geschoben, wodurch das älteste Blatt des
Suchbaums 73 (Fig. 3) gelöscht wird (d. h. aus dem
Suchfenster geschoben wird), wenn das Suchfenster voll ist.
-
Wie vorher dargelegt, löst das Löschen von Blättern aus einem
Suchbaum vom Suffixtyp 73 erwünsahterweise das Löschen von
Elternknoten, die mit lediglich einem Sohn zurückgelassen
sind, aus. Aus diesem Grund wird die Position des Eltern-
Knotens, der aus einem solchen Baum gelöscht wird, jedenfalls
einer Perkolation aufwärts in Richtung der Wurzel des Baums
mehr oder weniger gemäß dem oben beschriebenen Prozeß
unterzogen (d. h. der Positionszeiger des Knotens, der
gelöscht wird, wird immer in das Positionsfeld des Knotens
der nächst höheren Stufe geschrieben, aber von dort mit
Vorbehalt in Abhängigkeit von dem Zustand des
Aktualisierungsbits der Knoten der höheren Stufen aufwärts
propagiert). Die grundlegende Unterscheidung ist, daß während
einer Perkolationsaktualisierung von einem gelöschten Knoten
der existierende Positionszeiger für jeden Knoten der höheren
Stufen, der eine solche Aktualisierung erfährt, mit dem
Positionszeiger der vorgeschlagenen Aktualisierung verglichen
wird, wodurch erlaubt wird, daß der jüngste dieser zwei
Zeiger ausgewählt wird (1) als Positionszeiger für den
Knoten, der die Aktualisierung empfängt, und (2) als
vorgeschlagene Aktualisierung für den Knoten der
nächsthöheren Stufe, falls der Aktualisierung erlaubt ist, zu
ihm zu propagieren.
-
Im schlimmsten Fall können alle Knoten auf dem Pfad von dem
Eltern-Knoten für das Suffixblatt oder dem Schlußsymbol einer
neu eingesetzten Symbolkette bis zu der Wurzel des Baums
"wahr"-Aktualisierungsbit haben, wodurch bewirkt wird, daß
eine Aktualisierung den gesamten Weg bis zur Wurzel des Baums
einer Perkolation unterzogen wird. Allerdings kann gezeigt
werden, daß der oben beschriebene
Perkolationsaktualisierungsprozeß in einer konstanten
Zeitdauer pro Symbol oder Zeichen durchgeführt werden kann,
wenn die Zeit, die erforderlich ist, um ihn durchzuführen,
über alle Blätter des Suchbaums 73 amortisiert wird. Es kann
außerdem, was sogar noch wichtiger ist, gezeigt werden, daß
der Prozeß bei der Beibehaltung gültiger Positionszeiger in
allen internen Knoten des Suchbaums 73 effektiv ist, so daß
die Knoten genau auf Suchfenster-Symbolpositionen bezogen
sind, die die Symbole enthalten, die sie darstellen.
-
Weitere Implementierungen des Suchbaums 73 ergeben sich von
selbst. Beispielsweise ist aus der vorangegangenen Diskussion
der Trie-Bäume und er PATRICIA-Bäume klar, daß die
Perkolationsaktualisierung, die für den Suffixbaum geschaffen
wurde, dadurch vermieden werden kann, daß zum Einsetzen einer
jeden Symbolkette einfach zu der Wurzel des Baums
zurückgekehrt wird. In diesem Fall erfordern die internen
Knoten des Baums keine Aktualisierungsbits, und es wäre
unnötig, die Aktualisierung durchzuführen, wenn Knoten
gelöscht werden. Gleichermaßen sind Suffixverbindungen nicht
wesentlich, um Suffixknoten während des Einsetzens von
Symbolketten in einen solchen Suchbaum zu lokalisieren, obwohl
sie signifikant die durchschnittliche Zeit, die zur
Durchführung dieser Aufgabe erforderlich ist, verringern. In
ihrer Abwesenheit wäre es möglich, an dem Suffixblatt für eine
gegebene Kette zu beginnen, und dann den Eltern-Zeigern zurück
zu der Wurzel des Baums zu folgen, bis der Suffixknoten
erreicht wird. Es ist offensichtlich, daß das Suffixblatt für
eine gegebene Symbolkette leicht lokalisiert wird, da es das
erste nicht übereinstimmende Symbol ist, das einer Kette, wie
beispielsweise der Kette aXY (Fig. 8) folgt, von der bekannt
ist, daß sie eine Übereinstimmung aufweist, die ihren Ursprung
an einer vorbestimmten Symbolposition p in dem Suchfenster
hat. Außerdem kann der Suffixknoten für eine solche
Symbolkette durch Verwendung der Elternzeiger zum
aufwärtsseitigen Bewegen von dem Suffixblatt in Richtung der
Wurzel des Baums eine geeignete Anzahl von Stufen, wie sie
durch die Länge der Kette, die eingesetzt wird, bestimmt ist,
identifiziert werden, wodurch der Vorteil erhalten bleibt, daß
man zum Einsetzen einer jeden Symbolkette nicht zur Wurzel des
Baums zurückkehren muß (wie offensichtlich ist, sind die
Kosten einer Bewegung durch den Suchbaum nicht gleichmäßig, da
normalerweise ein Nachsehen in Hash-Tabellen erforderlich ist,
um sich von Stufe zu Stufe abwärts in Richtung der
Suffixblätter zu bewegen). Wenn allerdings die maximal
erlaubte Kopielänge lang ist, ist im schlimmsten Fall dieser
alternative auf Suffixknoten basierende Ketteneinsetzprozeß
unerwünscht langsam. Gleichfalls ist, falls einige Teile des
Suchbaums 73 tief sind, eine übermäßig lange durchschnittliche
Aktualisierungszeit erforderlich, wenn alle Aktualisierungen
zur Wurzel des Baums propagieren müssen. Deshalb sind
Suffixverbindungen und Perkolationsaktualisierung im
allgemeinen bevorzugt.
D. Erweiterte Ausführungsformen
1. Statistisch empfindliche Codierung
-
Wie offensichtlich ist, erfordert eine effiziente Verwendung
von Literal- mit fester Länge und Kopie-Codeworten ein
vorsichtiges Balancieren zwischen der Länge dieser Codewörter
und den durchschnittlichen Längen der Literale und den Kopien,
in welche die Quelldaten zu zerfallen neigen. Eine Erhöhung
der Größe des Suchfensters neigt zu einer Erhöhung der
durchschnittlichen Länge der übereinstimmenden Symbolketten,
die gefunden werden können, allerdings erhöht sich ebenfalls
die Größe der Positionszeiger, die erforderlich sind, um die
individuellen Symbolpositionen innerhalb des Suchfensters zu
spezifizieren. Diese größeren Zeiger können die Kompression,
die erzielt wird, verringern, falls sie indiskriminant
verwendet werden, da die Zeiger, die auf die jüngsten
Symbolpositionen verweisen, wahrscheinlicher verwendet werden.
Außerdem sind kürzere Literale und Kopien wahrscheinlicher als
längere Literale und Kopien. Demgemäß sind Literal und Kopie-
Codeworte zur Ausführung der vorliegenden Erfindung mit einer
statistisch sensitiv variablen Länge vorteilhafter zu
verwenden, wenn eine erhöhte Kompression erwünscht ist.
-
Verschiedene Techniken können verwendet werden, um solche
Codewörter mit statistisch sensitiver variabler Länge zu
liefern. Beispielsweise kann eine adaptive Huffman-Codierung
oder eine arithmetische Codierung der Literallängen und der
Kopielängen und der Verschiebungen, die der
Codierlogikschaltung 74 (Fig. 3) berichtet werden, verwendet
werden. Allerdings ist eine solche Codierung im allgemeinen
langsam und würde bloß einen sekundären adaptiven Vorteil
liefern, da das Suchfenster mit fester Länge der
Kompressionseinrichtung 12 (Fig. 3) bereits eine Adaption an
die Quelle bewirkt. Ein anderer Ansatz ist es, eine erweiterte
Familie eindeutiger Codeworte von verschiedener Bit-Länge der
Codierung von Literalen verschiedener Länge, sowie der
Codierung der Kopien verschiedenen Längen und der
Verschiebungen vorher zuzuweisen. In diesem Fall werden kurze
Literale und kurze benachbarte Kopien typischerweise dadurch
codiert, daß ihnen relativ kurze Codeworte zugewiesen werden,
während längere Literale und längere und/oder entfernt
verschobene Kopien dadurch codiert werden, daß ihnen längere
Codeworte zugewiesen werden, wodurch die Längen der
verwendeten Codewörter auf ein vorbestimmtes Modell der
Frequenzverteilung von dem Literal und der Kopiekomponenten,
in welche die durchschnittliche Quelle zerfällt, abgestimmt
werden. Eine repräsentative Familie von gegenseitig
unterscheidbaren Codewörtern (siehe ihre Eingangsindikator-
Bitsequenzen), die in ihrer Länge von vier bis dreißig Bit
reichen (siehe ihre Größen) werden im folgenden dargelegt,
zusammen mit den Codieraufgaben, denen sie zugewiesen sind
(siehe ihre Namen und die Kettenlängen, die durch sie
innerhalb verschiedener Verschiebungsbereiche des 16k langen
Suchfensters abgedeckt sind), sowie den Layouts, die diesen
Codeworten ermöglichen, die Literale und Kopien, denen sie
zugewiesen sind, eindeutig zu codieren (siehe die Codewort-
Layouts):
-
Außerdem wurde in Übereinstimmung mit einem der wichtigeren
Merkmale dieser Erfindung gefunden, daß es eine direktere und
effektivere Technik zum Erzeugen von Literal- und Kopie-
Codeworten mit statistisch sensitiver, variabler Lange ist,
einen monadischen Codierer zu schaffen, wie er mit dem
Bezugszeichen 91 in Fig. 10 gezeigt ist, um lineare
Progressionen von monadischen < Start, Schritt, Stop> -Codes zur
Darstellung der Längen der Literale und der Längen und
verschiebungen der Kopie zu liefern. Wie zu sehen sein wird,
werden die Codierregeln oder Strategien durch die
Codierlogikschaltung 92, die über dem monadischen Codierer 91
lokalisiert ist, bewirkt, andernfalls ist die in Fig. 10
gezeigte Kompressionseinrichtung der in Fig. 3 gezeigten
Kompressionseinrichtung hinreichend ähnlich, so daß die
Verwendung von gleichen Bezugszeichen zur Identifikation
gleicher Teile erlaubt ist.
-
Als Frage der Definition umfaßt ein monadischer < Start,
Schritt, Stop> -Code einen monadischen Code-Indikator zum
Spezifizieren der Bit-Länge des Feldes, in welchem die Länge
des Literals oder die Länge oder Verschiebung der Kopie
digital aufgezeichnet ist, gefolgt von dem Wertefeld selbst.
Dieses Wertefeld ist seinerseits beschränkt, so daß es nicht
weniger Bits als die spezifizierte "Start"-Zahl und nicht mehr
Bits als die spezifizierte "Stop"-Zahl enthält. Außerdem
variiert die Bit-Länge des Wertefelds in Inkrementen als
lineare Funktion des spezifizierten "Schritt"-Parameters, so
daß eine lineare Progression von Codes mit variablen Längen
definiert wird. Deshalb umfaßt n-te Codewort eines solchen
Codes n-1 "1" die durch eine einzelne "0" beendet werden
(d.h. dem monadischen Feldlängenindikator), gefolgt von einem
Wertefeld der Größe (Start + (n-1) Schritt). Integerwerte sind
sequentiell durch diese Codewörter mit verschiedener Größe
ausgelegt. Beispielsweise bilden sich die vier Codewörter mit
unterschiedlicher Länge eines monadischen < 3,2,9> -Codes in die
Integerzählwerte wie folgt ab:
-
Wie zu sehen sein wird, kann der einzelne "0"-Abbruch für den
monadischen Feldlängenindikator weggelassen werden, wenn die
Bitlänge des Wertefelds gleich der gegebenen "Stop"-Größe ist.
Ein vereinfachtes Pseudocode-Computerprogramm zur Erzeugung
von monadischen Codes ist im Anhang B dargelegt, der hierbei
unter Bezugnahme aufgenommen wird, obwohl es offensichtlich
ist, daß ein Verfahren zum Nachsehen in einer Tabelle eine
gangbare Alternative für die Codierung monadischer Codes ist.
Außerdem wird ebenfalls Anhang C durch Bezugnahme aufgenommen,
da er ein Cedar-Sourcecode-Listing fur ein
Datenkompressionssystem vom Textsubstitutionstyp ist, das eine
monadische Codierung auf Literale und Kopien, die durch
Dekomposition der Quelldaten gemäß den oben dargelegten
logischen Regeln identifiziert werden, verwendet. Es soll
allerdings angenommen werden, daß die monadische Codierung für
verschiedene Typen von Datenkompressionen, die Lauflängen oder
Kettenlängen abhängig sind, verwendet werden kann, um die
Länge, über der eine kompressible Kohärenz existiert (und/oder
der Länge über der die inkompressible Inkohärenz existiert),
zu erfassen, und in dem Fall eines Datenkompressionssystems
vom Textsubstitutionstyp den Ort, an dem die Redundanz
gefunden werden kann. Im allgemeinen kann sogar eine
monadische Codierung in digitalen Datenkompressionsystemen
verwendet werden, um eine Codierung mit variabler Länge von
numerischen Werten, einschließlich Lauflängen, Kopielängen,
Kopieverschiebungen, Literallängen etc. zu schaffen.
-
Wie zu verstehen ist, können verschiedene Faktoren die Auswahl
der monadischen < Start, Schritt, Stop> -Codes zum Codieren der
Literallängen und der Kopielängen und der verschiebungen der
gemäß der oben beschriebenen Codierregeln komprimierten Daten
beeinflussen. Beispielsweise kann, wie durch die vereinfachte
in Fig. 11 gezeigte Finite-State-Maschine (FSM) dargestellt
ist, ein monadischer < 2, 1, 10> -Code verwendet werden, um
Kopielängen zu codieren, wodurch die maximal erlaubte
Kopielänge auf 2044 Symbole beschränkt ist. Eine Kopielänge
von Null zeigt ein Literal an; dessen Länge dann unter
Verwendung eines monadischen < 0, 1, 5> -Codes codiert wird, so
daß die maximal zulässige Literallänge 63 Symbole ist. Falls
andererseits die Kopielänge nicht Null ist, kann die
Kopieverschiebung mit einem monadischen < 10, 2, 14> -Code
codiert werden, um auf Kopien, die irgendwo innerhalb eines
Suchfensters mit einer Breite von 21504 Symbolpositionen ihren
Ursprung haben, zu zeigen. In der Praxis werden die maximalen
Kopie- und Literallängen typischerweise so ausgewählt, daß in
den monadischen Progressionen verschwendete Zustände vermieden
werden. Eine ähnliche Technik wird manchmal auch verwendet, um
verschwendete Zustände in der monadischen Codierung von
Kopieverschiebungen zu vermeiden.
-
Die monadischen Codes, die verwendet werden, können auch
verbessert werden (nicht gezeigt), um verschwendete Zustände
zu vermeiden.
-
Beispielsweise stellen die zuvor beschriebenen Regeln zur
Dekomposition von Quelldaten in Literale und Kopien sicher,
daß ein Literal mit einer Literallänge, die weniger als die
maximal erlaubte Literallänge ist, niemals unmittelbar von
einem anderen Literal oder einer Kopie der Länge zwei gefolgt
wird. Somit kann, immer wenn ein Literal mit einer solchen
nicht maximalen Länge codiert wird, der < 2, 1, 10> -Code für
die Codierung, die einem solchen Literal folgen muß, um zwei
nach unten verschoben werden, mit dem Ergebnis, daß dann ein
Codewert von Null eine Kopie der Länge drei bedeutet, ein
Codewert von eins eine Kopie der Länge vier bedeutet usw.
-
Eine andere während des Hochfahrens wertvolle Verbesserung ist
es, die Kopieverschiebungscodierung allmählich einzuführen,
wenn das Suchfenster gefüllt wird. Beispielsweise kann eine
solche Einführung durch Verwendung eines monadischen < 10-x, 2,
14-x> -Codes für Kopieverschiebungen realisiert werden, wobei x
anfänglich auf zehn gesetzt wird, dann auf Null dekrementiert
wird, wenn es gefordert wird, um den Verschiebungszeiger zu
ermöglichen, alle Fensterpositionen zu identifizieren, die
vorher komprimierte Symbole enthalten.
-
Eine andere Technik, die verwendet werden kann, um
verschwendete Zustände in der Kopieverschiebungscodierung zu
vermeiden, ist es, das größte Feld in seiner monadischen
Progression schrumpfen zu lassen bis es gerade groß genug ist,
um eine Familie von "Sparse"-Codeworten zur eindeutigen
Identifizierung jeder der unterschiedlichen
Verschiebungswerte, welche das Feld repräsentieren sollen, zu
schaffen. Somit bewirkt, wenn eine Gesamtheit von v Werten,
die in dem größten oder dem "Stop"-Größen-Feld von einem
monadischen < 10-x, 2, 14-x> -Code codiert werden sollen, eine
"Sparse-Codierung" dieses Feldes, das die kleineren dieser v
Werte mit log&sub2; v Bits und die größeren von ihnen mit log&sub2; v
Bits codiert werden. Wie offensichtlich ist, vermeidet eine
solche sparse-Codierung das Erfordernis, 14-x Bits zur
Codierung jedes der v Werte zu verwenden, wodurch die Bit-
Größe der Kopie-Codeworte bei den größten Verschiebungswerten
verwendet wird.
-
Um die Technik des Sparse-Codierens weiter zu erläutern, wird
die Codierung eines von sechs Werten betrachtet. Falls ein 3-
Bit-Feld zur Codierung des Werts verwendet wird, sind zwei der
acht möglichen Zustände 2 verschwendete Zustände. Allerdings
gibt es keine verschwendeten Zustände, falls die Werte 0 und 1
in 2 Bits und die Werte [2. .5] in 3 Bits wie folgt codiert
werden:
-
Typische Sparse-Codier- und -Decodier-Prozeduren sind im
folgenden dargestellt:
2. Schnellere Kompressionseinrichtungen
-
Die vorstehenden Kompressionseinrichtungen formatieren die
komprimierten Daten so, daß sie relativ schnell mittels
Expansionseinrichtungen, die eine beschränkte
Speicherkapazitkt, wie beispielsweise die
Expansionseinrichtung 63 (Fig. 5), haben, expandiert werden
können. Deshalb sind sie insbesondere für Anwendungen, in
denen die Kompressionsgeschwindigkeit weniger wichtig als eine
Vereinfachung des Designs und eine Optimierung der
Leistungsfähigkeit der Expansionseinrichtung ist,
beispielsweise, wenn es erwünscht ist, eine
Massenveröffentlichtung von Software in komprimierter Form auf
Floppy Disks zur Verteilung an und Expansion durch die
Endverbraucher zu erzeugen, gut geeignet. Zusätzlich eignen
sich die vorangegangenen Kompressionseinrichtungen für eine
natürliche und vernünftige einfache Hardware Implementierung.
Beispielsweise wird in einer VLSI Hardware-Ausführungsform der
Suchbaum eliminiert und durch eine Anzahl von Komparatoren
ersetzt, die gleichzeitig an vielen Zeichen in dem Suchfenster
arbeiten, um die längste Übereinstimmung zu bestimmen.
Geeigneterweise werden die Symbole, die in dem Suchfenster
enthalten sind, auf einem Halbleiterspeicher-Chip gespeichert,
so daß keine externen Speicherreferenzen erforderlich sind,
während die längste Übereinstimmung bestimmt wird. Teilweise
kann diese Art von Kompressionseinrichtung, weil keine
externen Speicherreferenzen erforderlich sind, extrem schnell
laufen und eine sehr gute Kompression bei einer großen
Vielfalt von Daten erzielen. Zusätzlich hat sie, weil sie auf
einen einzelnen Chip paßt, Vorteile in Anwendungen, in denen
eine autonome, Datenkompressions funktion ohne irgendwelche
Anforderungen an die Computerfunktionen für allgemeine Zwecke
erwünscht ist.
-
Allerdings gibt es andere Situationen, in denen schnellere
Software-Kompressionseinrichtungen vorzuziehen sind,
beispielsweise wenn Dateien in komprimierter Form archiviert
werden sollen. Somit kann gemäß einem anderen Merkmal der
vorliegenden Erfindung die Kompressionsgeschwindigkeit der
oben beschriebenen Ausführungsform der vorliegenden Erfindung
für Codeworte mit fester Länge und Codeworte mit monadisch
codierter variabler Länge signifikant dadurch erhöht werden,
daß die Kopien darauf beschränkt werden, daß sie an einer
Grenze beginnen, die durch das Anfangssymbol einer vorherigen
Kopie oder durch ein Symbol, das vorher in den komprimierten
Datenstrom als Literal eingesetzt worden ist, beginnen.
Anstelle eines Blatts in dem Suchbaum 73 (Fig. 3) für jedes
Symbol in dem Suchfenster, wie bei den vorher beschriebenen
Kompressionseinrichtungen, haben diese schnelleren
Ausführungsformen der Erfindung für jedes Kopie-Codewort und
jedes Literal nur ein Blatt in dem Suchbaum 73. Dies
verringert die Berechnung, die erforderlich ist, um den Baum
73 zu durchsuchen und zu aktualisieren, wodurch sich die
Kompressionsgeschwindigkeit für durchschnittliche Daten
signifikant erhöht. Übereinstimmungen, die bei dem zweiten
oder nachfolgenden Symbol einer vorherigen Kopie beginnen,
werden ignoriert, so daß die "längste verfügbare
Übereinstimmung" die längste Übereinstimmung irgendwo
innerhalb des Suchfensters sein kann oder nicht. Es ist
deshalb offensichtlich, daß die erhöhte
Kompressionsgeschwindigkeit, die durch diesen Ansatz
geschaffen wird, auf Kosten einer Verlangsamung der Rate, mit
der sich das System an Änderungen in den Quelldaten anpaßt,
erhalten wird. Zusätzlich ist, aus Gründen die noch
offensichtlich werden, die für diese schnelleren
Kompressionseinrichtungen komplementäre Expansionseinrichtung
etwas langsamer und erfordert mehr Speicherplatz.
-
Einer der Vorteile einer Beschränkung aller Kopien, so daß sie
ihren Ursprung in einer vorherigen Kopie oder einem Literal
haben, ist es, daß die Positionszeiger zur Lokalisierung von
vorherigem Auftreten wieder auftretender Symbolketten
komprimiert werden können, da sie nur in der Lage sein müssen,
den Beginn des y-ten vorherigen Codeworts oder ausgegebenen
Literalzeichens zu identifizieren. Beispielsweise können
"komprimierte Verschiebungen" wie folgt implementiert werden:
Zuerst wird ein Feld von Speicherelementen einer Länge, die
gleich der Fenstergröße ist, zum Speichern der Zeiger in den
Eingabepuffer der Kompressionseinrichtung vorgesehen. Jedes
Element dieses Felds zeigt auf ein unterschiedliches Kopiewort
oder ein Literalzeichen, das von der Kompressionseinrichtung
ausgegeben worden ist, so daß es eine eins-zu-eins Abbildung
zwischen den Blättern in dem Suchbaum 73 und den Elementen in
diesem Feld gibt, und jeder interne Knoten in dem Baum das
Feldelement identifiziert, das demjenigen seiner nachkommenden
Blätter entspricht. Als nächstes werden die
Kopieverschiebungen anhand der Anzahl von Feldelementen
zwischen demjenigen, das dem Blatt der übereinstimmenden
Zeichenkette entspricht (d.h. der Zeichenkette, für die die
Kopie substituiert wird) und dem Feldelement, das dem Blatt
oder dem internen Arc, auf dem die längste Übereinstimmung
gefunden worden ist, entspricht, gemessen. In anderen Worten
werden die Kopieverschiebungen in einem "Fenster mit fester
Länge", wie in den vorherigen Ausführungsformen gemessen,
allerdings wird die Position in dem Zeichenpuffer des
führenden Symbols eines vorherigen Auftretens einer
wiederauftretenden Zeichenkette dadurch bestimmt, daß anstelle
einer direkten Adressierung der "Suchfenster"-Symbolpositionen
"indirekt" durch dieses Feld der Zeiger gegangen wird. Somit
ist die Größe der Peferenzzeiger fest, aber die Länge des
Suchfensters kann in Abhängigkeit von der Zusammensetzung der
zuletzt komprimierten Daten expandiert und kontrahiert werden.
Die Kopielängen werden immer noch in Symbolen gemessen, so daß
die vorangegangene Beschreibung der Messung und der Codierung
der Kopielängen dieser modifizierten Ausführungsformen
anwendbar ist. Anhang D, der hierdurch mittels Bezugnahme
eingeschlossen ist, ist ein Cedar-Sourcecode-Listing für ein
Kompressionssystem, das auf den oben beschriebenen
Kompressionsregeln in Zusammenhang mit komprimierten
verschiebungen und monadischer Codierung beruht.
-
Symbolketten werden in den Suchbaum 73 (Fig. 3) dieser
schnelleren Kompressionseinrichtung dadurch eingesetzt, daß an
der Wurzel des Baums bei jeder Iteration begonnen wird. Die
Ketten können in Linearzeit eingesetzt werden, da sie
lediglich an existierenden Codewort/Literalzeichen-Grenzen
eingesetzt werden. Suffixzeiger und propagierende
Aktualisierungen sind unnötig, so daß der Suchbaum 73 (Fig. 3)
für diese Ausführungsformen vorzugsweise ein relativ einfacher
PATRICIA-Baum (siehe Fig. 7A-7E) ist. Es ist außerdem zu
bemerken, daß es nützlich ist, ein Feld permanenter Knoten für
alle Symbole mit einer Tiefe 1 eines Suchbaums 73 vom
PATRICIA-Typ für diese Ausführungsformen zu erzeugen. Dies
kann durchgeführt werden, selbst wenn das Suchfenster zu allen
Zeiten kein Symbol, das jedem dieser permanenten Knoten
entspricht, enthalten kann, weil eine Kopie der Länge 1
niemals ausgegeben wird. Wenn ein solches permanentes Feld von
Knoten für den Suchbaum 73 geschaffen wird, können
Zeichenketten in den Baum dadurch eingesetzt werden, daß in
das permanente Knotenfeld basierend auf dem ersten Symbol der
Kette, die eingesetzt wird, indiziert wird. Danach verläuft
der Einsetzprozeß typischerweise durch Nachsehen in Hash-
Tabellen und Arcvergleichen, um tiefer in den Baum, wie vorher
im Zusammenhang mit der Verwendung des Suchbaums PATRICIA-Typ
im allgemeinen beschrieben worden ist, abzusteigen. Insofern
als alle Knoten auf dem Suchpfad für eine Symbolkette, die in
dem Baum eingesetzt worden ist, weitergegeben werden, während
die Kette eingesetzt wird, können die aktualisierten
Suchfenster-Symbolpositionen für die Symbole, die durch diese
Knoten dargestellt sind, in die Positionsfelder der Knoten
geschrieben werden, während in dem Baum während des
Einsetzprozesses herabgestiegen wird.
-
Ein Beschränken der Kopien, so daß sie in Symbolen ihren
Ursprung haben, die vor Kopie-Codeworten oder mit Symbolen,
die von vorherigen Literalen enthalten sind, beginnen,
verringert die Möglichkeit dieser modifizierten
Kompressionseinrichtungen, die lokale Kohärenz der Quelldaten
einzunehmen, aber erlauben die Verwendung von komprimierten
Zeigern von relativ mäßiger Bitgröße, um relativ weit in die
vorher komprimierten Quelldaten zurückzugehen, wodurch es
möglich wird, größere Suchfenster zu verwenden, um längere
Übereinstimmungen zu liefern. Dies ist ein Vorteil für
Quelldaten, die eine natürliche Wortstruktur haben, wie
beispielsweise Text. Die vorangegangene Beschränkung kann
allerdings für die Kompression von Quelldaten, die eine
wesentliche Menge an hoch lokalisierter Kohärenz haben, wie
sie beispielsweise existiert, wenn die Quelle ein abgetastetes
Bild darstellt, als unerwünscht zeigen.
3. Zusätzliche Variationen
-
Verschiedene Variationen dieser Schemata können zur
Aktualisierung des Suchbaums 73 (Fig. 3) häufiger verwendet
werden als an jeder vorherigen Kopie/Literalgrenze.
Beispielsweise kann ein Blatt dem Suchbaum 73 zwischen den
Symbolen, die durch jedes Kopie-Codewort mit der Länge 2
dargestellt sind, hinzugefügt werden, und/oder ein Blatt kann
in den Suchbaum dem letzten Symbol einer jeden Symbolkette,
die durch ein Kopie-Codewort mit einer Länge 3 dargestellt
ist, folgend eingesetzt werden. In der Tat ist jede Variation
eines Einsetzens von Blättern in dem Baum zwischen den
Extremwerten, die durch die vorangegangene
Kompressionseinrichtungen dargestellt worden sind (in einem
wird für jedes Symbol ein Blatt eingesetzt, und in dem anderen
wird ein Blatt pro Kopie-Codewort und eines pro Literalzeichen
eingesetzt), innerhalb des allgemeinen Rahmens dieses
Verfahrens realisierbar. Es ist wahrscheinlich, daß eine etwas
erhöhte Kompression durch Verwendung dieser oder anderer
Techniken zum Erhöhen der Fähigkeit dieser schnelleren
Kompressionssysteme erzielt werden kann, so daß die lokale
Kohärenz der Quelldaten eingenommen werden kann, allerdings
würden ihre Kompression und Expansionsgeschwindigkeiten
verringert. Es gibt auch Variationen, in denen der Baum an
einem Punkt eingefroren und nicht aktualisiert wird, so daß
zusätzliche Quellsymbole danach als Kopien und Literale auf
der Basis von statischen Datenstrukturen des Suchbaums codiert
werden, aber der Baum für die gerade codierte Kette nicht
aktualisiert wird. In diesem Fall kann die Kompression
aufgrund nicht stationärer Statistiken der Quelldaten
abnehmen, aber ein Durchlaufen des Baums kann, falls es
erforderlich ist, wieder aufgenommen werden. Dieser Ansatz
kann in Anwendungen verwendet werden, in denen
Höchstgeschwindigkeit erforderlich ist, obwohl es
wahrscheinlich ist, daß eine niedrigere Kompression
resultiert.
-
Es gibt auch Variationen von beiden der zwei vorangegangenen
Verfahren, in denen das Fenster mit zweckmäßigen Symbolen
vorbereitet bzw. instruiert oder initialisiert wird, so daß
die Kompression des frühesten Teils der Quelle verbessert
werden kann. Während es wahrscheinlich ist, die Kompression zu
verbessern, wenn die Quelldaten den vorbereiteten Daten
ähneln, ist es etwas komplexer und wird die Kompression
verschlechtern, wenn die Quelldaten nicht den vorbereiteten
Daten ähneln.
-
Zusätzlich zu Variationen, wenn Ketten zu dem Suchbaum
hinzugefügt oder von ihm entfernt werden, gibt es Variationen
der Datenstrukturen, die in einer Software-Ausführungsform
verwendet werden. Im Anhang C haben wir einen Suffixbaum
verwendet, in dem Arcs in eine gekettete, kreisförmige Hash-
Tabelle eingesetzt werden. Es ist anzumerken, daß in einer
Hardware-Ausführungsform kein Baum erforderlich ist, und nur
das Fenster das Wesentliche für das Kompressionsverfahren ist.
Es ist auch zu bemerken, daß in einer Software-Ausführungsform
viele andere Arten von Hash-Tabellen, Listen oder
Datenstrukturen verwendet werden können, um einen Suffixbaum
zu implementieren. Außerdem ist anzumerken, daß der Suffixbaum
durch den einfacheren PATRICIA-Baum ersetzt werden kann,
obwohl wir glauben, daß diese Implementierung nicht so gut
ist; oder er könnte durch einen binären Baum, eine sortierte
Liste oder andere Datenstrukturen ersetzt werden. Solche
Variationen sind auch für Anhang C möglich. Alle dieser
Variationen bewegen sich innerhalb den Fähigkeiten eines
Fachmanns auf dem Gebiet der Programmierung.
-
Zusätzlich ist anzumerken, daß es möglich ist, äquivalente
Kompressionseinrichtungen unter Verwendung anderer
Symbolgrößen zu verwenden, während die Implementationen in den
Anhängen A, C und D 8-Bit-Symbole oder Zeichen verwenden.
-
Außerdem sollte es klar sein, daß, während die
Ausführungsformen in den Anhängen A, C und D "gierig" in dem
Sinn sind, daß ihre Kopie-Codeworte immer auf die längste
Übereinstimmung, die in dem Fenster gefunden worden ist,
verweisen, liegt es innerhalb der Möglichkeiten eines
Fachmanns auf diesem Gebiet, eine Variation zu implementieren,
in der manchmal eine Übereinstimmung, die kürzer als die
längste Übereinstimmung ist, codiert wird, wenn sie durch ein
kürzeres Codewort als die längste Übereinstimmung dargestellt
werden kann. Es ist wahrscheinlich, daß eine solche Variation
langsamer ist als die "gierigen Counterpart-Methoden" kann
aber im Durchschnitt eine etwas höhere Kompression erzielen
(und im schlimmsten Fall kann sie eine viel höhere Kompression
erzielen).
-
Außerdem verwenden die zwei vorangegangenen
Kompressionseinrichtungen bestimmte Strategien zum Auswählen
zwischen Kopie- und Literal-Codeworten und zum Entscheiden, an
welchem Punkt ein Literal-Codewort anstelle einer Kopie
abgebrochen wird. Es ist anzumerken, daß viele andere
Strategien möglich sind und eine Implementierung einer jeder
von diesen innerhalb der Möglichkeiten eines Fachmanns auf dem
Gebiet liegt.
-
Schließlich ist es möglich, während die Ausführungsform von
Anhang C eine Kopielänge und Verschiebung unabhängig unter
Verwendung monadischer < Start, Schritt, Sto> )-Codes codiert,
Variationen zu verwenden, in denen die monadische oder eine
andere Codierung der Kopielänge von der bereits kopierten
Verschiebung abhängig ist, oder in denen die monadische oder
eine andere Codierung der Kopieverschiebung von der bereits
codierten Kopielänge abhängig ist. In der Tat schlagen sich
weitere andere Variationen, einschließlich der Verwendung
eines einzelnen Prefix-Codes zum Bestimmen der Codierung von
sowohl der Codierlänge als auch der Kopieverschiebung (siehe
die oben diskutierte Codierung mit fester Länge) von selbst
vor. All diese Variationen liegen innerhalb der Möglichkeiten
eines Fachmanns auf dem Gebiet der Programmierung, und eine
bestimmte Wahl würde durch die Einfachheit der Implementation
und die statistischen Charakteristika der repräsentativen
Quelldaten-Stichproben beherrscht werden.
4. Verbesserung des Kompressionsverhältnisses
-
Die Codierung der komprimierten Daten durch die oben
beschriebenen Kompressionseinrichtungen ist suboptimal, weil
die komprimierten Daten mehrfach codierte Fälle identischer
Symbolketten innerhalb des adressierbaren Bereichs des
Suchfensters enthalten können, selbst wenn nur ein Ereignis
einer jeden Symbolkette erforderlich ist, um zu erlauben, daß
alle nötigen Kopien gemacht werden. Diese Suchbaum-
Datenstruktur verschwendet allerdings keinen Platz, weil
wieder auftretende Symbolketten sich gemeinsam Suchpfade
innerhalb dieser teilen.
-
Deshalb kann zur Verbesserung des Kompressionsverhältnisses
die Codierung unter Verwendung von Kopie-Codeworten
durchgeführt werden, die direkt auf der Suchbaum-
Datenstruktur, wie beispielsweise der Struktur eines PATRICIA-
Baums (Fig. 7A-7E) basieren, durchgeführt werden.
Beispielsweise kann ein einzelnes Bit-Prefix ("0" oder "1")
verwendet werden, um zwischen Kopie-Codeworten zu
unterscheiden, die Übereinstimmungen darstellen, welche an
einem der Blätter eines solchen Baums abbrechen (eine
LeafCopy) und Übereinstimmungen, die an einem internen Arc des
Baums (eine NodeCopy) abbrechen. Identische Suchbäume werden
in der Kompressionseinrichtung und der Expansionseinrichtung
aufgebaut, wobei die Expansionseinrichtung die Codeworte
verwendet, die sie von der Kompressionseinrichtung empfängt,
um den Baum, der durch die Kompressionseinrichtung konstruiert
worden ist, zu reproduzieren. Wie noch zu sehen sein wird,
enthält jedes LeafCopy- und NodeCopy-Codewort zwei
Informationselemente, um die Symbolkette, die es darstellt, zu
spezifizieren: ein Knoten oder Blatt und eine Arc-Verschiebung
(die Verschiebung ist erforderlich, weil die Arcs eines
PATRICIA-Baums mehr als ein Symbol darstellen können). Es ist
anzumerken, daß Ketten, die zweimal oder öfter innerhalb des
Bereichs des Suchfensters erscheinen, als Einzelknoten-Arc
erscheinen, so daß sie als NodeCopies ohne Redundanz in ihrer
Codierung komprimiert werden.
-
Wenn insbesondere eine NodeCopy aufgerufen wird, folgt ihrem
Identifizierungs-Prefix eine Knotennummer nach, die Bezug auf
den nächsten freien Knoten innerhalb eines Bereichs
[0...maxNodeNo] nimmt, wobei maxNodeNo die größte Knotennummer
ist, die seit der Initialisierung des Kompressionssystems
verwendet worden ist. Dann wird die Arc-Verschiebung basierend
auf der Anzahl von Symbolen des einlaufenden Arcs codiert.
Falls, wie dies oft der Fall ist, lediglich ein einzelnes
Symbol auf dem einlaufenden Arc vorhanden ist, kann die
Verschiebung inferenziell durch Unterdrücken des Längenfelds
codiert werden. Falls allerdings der einlaufende Arc eine
Mehrzahl von Symbolen darstellt, wird der Knotennummer zum
Aufzeichnen des Werts, der den Ort längs des Arcs, an dem die
Übereinstimmung auftritt, anzeigt, ein Längenfeld angehängt.
-
Typischerweise ist der aufgezeichnete Wert 0 für eine
Übereinstimmung, die genau an dem neuen Knoten auftritt, 1 für
eine Übereinstimmung, die bei der Verschiebung von einem
Symbol abwärts von dem Elternknoten auftritt, 2 für eine
Übereinstimmung, die zwei Symbole abwärts des Elternknotens
auftritt, etc. Geeigneterweise wird eine Sparse-Code
verwendet, um die NodeCopy-Arc-Verschiebungen zu codieren, so
daß das Längenfeld dieser Codeworte im allgemeinen aus einem
oder zwei Bits zusammengesetzt ist.
-
Wenn andererseits eine LeafCopy aufgerufen wird, folgt ihrem
identifizierenden Präfix ein monadisches < 1,1,11> -Längenfeld
(solch eine monadische Progression kann Arclängen von einer
Länge bis zu 4094 Symbolen kopieren), um die
Abwärtsverschiebung des Leaf-Arcs von dem Elternknoten, an dem
die Übereinstimmung abgebrochen wird (wobei eine Arc-
Verschiebung von Null ein Literal bezeichnet) zu
spezifizieren. Dem Längenfeld einer LeafCopy mit einem Arc-
Verschiebungswert, der ungleich Null ist (d.h., einer der kein
Literal bezeichnet) folgend, wird die Suchfenster-
Symbolposition des führenden Symbols der übereinstimmenden
Symbolkette codiert; vorzugsweise durch allrnähliches Einführen
in eine andere geeignete monadische Progression, wie
beispielsweise die < 10-x,2,14-x> -Progression, die oben
beschrieben worden ist.
-
Literale sind geeigneterweise dadurch eindeutig identifiziert,
daß eine LeafCopy mit einer Arc-Verschiebung von 0 als ihre
Einführungsbitsequenz oder "Flag" verwendet wird. Diesen
einführenden "Flag"-Bits folgt ein Längenfeld, das die Länge
des Literals unter Verwendung einer anderen monadischen
< Start, Schritt, Stop> -Progression, wie beispielsweise einem
< 0,1,5> -Code codiert wird. Die Codierungsregeln verbieten, daß
einem Literal mit weniger als der maximal erlaubten Länge
sofort ein anderes Literal folgt, so daß die monadischen Codes
für die Arc-Verschiebung einer LeafCopy, die sofort nach einem
solchen Literal codiert wird, um 1 nach unten verschoben
werden kann, so daß eine Arc-Verschiebung von 1 dann als
codiert wird, eine Verschiebung von 2 als 1 codiert wird, etc.
-
Knotennummern für NodeCopies werden unter Verwendung einer
Sparse-Codierung für die Werte [0 ... maxNodeNo] codiert,
selbst wenn es wünschenswert ist, sie gemäß eines zuletzt
verwendeten (LRU)-Selektionsalgorithmus zu behandeln und eine
Codierung zu verwenden, welche die Anzahl der Bits, die
erforderlich sind um die letzten verwendeten Knoten zu
identifizieren, zu verringern. Wie offensichtlich ist, kann
eine solche Knotenverwaltung und ein Codierschema nach
Belieben des Designers implementiert werden.
-
Wie vorher dargelegt, muß zur Dekompression der Daten die
Expansionseinrichtung für diese Ausführungsform einen Suchbaum
rekonstruieren und aufrecht erhalten, welcher Pfade enthält,
die identisch mit denjenigen des Suchbaums der
Kompressionseinrichtung während der Kompression/Expansion der
entsprechenden Abschnitte der Quelldaten sind. Im Gegensatz zu
der Kompressionseinrichtung ermöglichen es allerdings die
Codeworte, die der Expansionseinrichtung zugeführt werden, die
Länge jeder Kopie zu bestimmen und sofort die Eltern eines
jeden neuen Knotens, der zu dem Baum hinzugefügt werden soll,
zu lokalisieren. Somit sind keine Hash-Tabellen erforderlich,
um in der Expansionseinrichtung Symbolketten in den Baum
einzusetzen, vorausgesetzt, daß die Codierungsstrategie so
beschränkt ist, daß immer eine Kopie ausgewählt wird, falls
die längste Übereinstimmung zwei oder mehr Symbole überspannt.
Mit dieser Beschränkung der Codierungsstrategie kann die
Expansionseinrichtung den Baum dadurch rekonstruieren, daß
jedes neue Blatt an den Knoten oder den Arc gehängt wird, der
durch das bestimmte NodeCopy- oder LeafCopy-Codewort, das ihn
decodiert hat, bezeichnet wird. Außerdem kann die
Expansionseinrichtung in dem Fall eines decodierten Literals
das Blatt an den Knoten mit einer permanenten Tiefe oder einer
Stufe 1 für das Literal-Symbol hängen (es wird daran erinnert,
daß ein Knoten mit einer permanenten Tiefe 1
vorteilhafterweise für jedes Quellsymbol vorgesehen ist).
E. Repräsentative funktionale Flußdiagramme
-
Um die vorangegangene Beschreibung zu ergänzen, werden im
folgenden repräsentative funktionale Flußdiagramme
beschrieben. Während diese Diagramme in einfacher Form
dargestellt sind und spezifisch für bestimmte
Ausführungsformen sind, werden sie einen allgemeinen Rahmen
für Personen, die daran interessiert sind, diese Erfindung in
verschiedenen Formen durchzuführen, schaffen. In einem
invertierbaren oder verlustfreien Kompressionssystem
komplementiert die Expansionseinrichtung notwendigerweise die
Kompressionseinrichtung, so daß eine funktionale
Leistungscharakteristik der Kompressionseinrichtung sehr stark
die Leistungsanforderungen an die Expansionseinrichtung
bestimmt. Einige der oben beschriebenen
Kompressionseinrichtungen erlauben eine direkte Adressierung
aller Symbole innerhalb des Suchfensters zur Lokalisierung von
vorherigem Auftreten wieder auftretender Symbolketten, während
andere solches vorheriges Auftreten durch indirektes
Adressieren bestimmter Symbole innerhalb des Suchfensters
(d.h., diejenigen, die vor Codeworten beginnen oder vorher als
Literale ausgegeben worden sind) durch die Verwendung eines
Felds von Zeigern oder durch Codieren der Baumstruktur
lokalisieren. Das Codieren und Decodieren der Baumstruktur für
die Kompression und Expansion von Quelldaten ist etwas
komplizierter als die direkte oder indirekte Adressierung des
Inhalts des Suchfensters, weshalb das Codieren und Decodieren
mit einer Baumstruktur in den folgenden Flußdiagrammen
vorgestellt wird.
1. Lokalisieren und Erweitern einer übereinstimmenden
Symbolkette
-
Bezug nehmend auf Fig. 12 verwenden alle
Stromkompressionseinrichtungen im wesentlichen dieselben
Prozesse, um ihre Suchbäume 73 (Fig. 3) aufrechtzuerhalten und
um vorheriges Auftreten von wiederauftretenden Symbolketten zu
identifizieren. Es wird in Erinnerung gerufen, daß
Dateikompressionseinrichtungen Quellsymbole aus einer Datei
"ziehen" und nicht die Quellsymbole zu ihnen "geschoben"
werden, aber im übrigen setzen sie Symbolketten in ihre
Suchbäume und halten ihre Suchbäume im allgemeinen auf
dieselbe Weise wie ihre
Stromkompressionseinrichtungsgegenstücke aufrecht. Die
"Strom"-Implementation der vorliegenden Erfindung ist so
konstruiert, daß sie einer Standard-"Strom"-I/O-Interface-
Spezifikation entspricht, so daß sie leicht mit anderen
Stromprozeduren, wie beispielsweise Datenverschlüsselungs- und
Entschlüsselungsroutinen und Datenkommunikationsprotokollen,
geschichtet werden kann.
-
Anhang E, der hierdurch unter Bezugnahme aufgenommen ist,
stellt Prozeduren dar, die erforderlich sind, um die
Stromkompressions- und Expansionsfunktionen, die mit den zuvor
genannten I/O-Spezifikationen konsistent sind (welche
außerhalb des Rahmens dieser vorliegenden Erfindung liegen) zu
schaffen. Wenn ein Kompressions-Software-Paket durch ein
Betriebssystem geladen wird, registriert es sich selbst mit
einer Kompressionsverfahrens-Registrierung (nicht gezeigt), so
daß auf die Prozeduren, die durch das Verfahren zur Verfügung
gestellt werden, durch Klienten (d.h., Datenquellen
und - senken, die die Dienstleistungen des Kompressionssystems
fordern) zugegriffen werden kann. Um eine Kompression
durchzuführen, initialisiert ein Klient zuerst mittels einer
"CreateEncodingStream"-Prozedur die Datenstrukturen, die von
der Kompressionseinrichtung benötigt werden; ein Argument von
"CreateEncodingStream" ist eine Ausgabestrom-Prozedur, an die
Codeworte, welche die Quelle darstellen, gesendet werden.
Nachfolgend überträgt der Klient Blöcke von Zeichen zur
Kompression unter Verwendung einer "CSUnsafePutBlock"-Prozedur
oder überträgt einzelne Zeichen unter Verwendung einer
"CSPutChar"-Prozedur. Während der Komprimierung einer Sequenz
von Quellsymbolen setzt die Kompressionseinrichtung Codeworte
in ihrem Ausgabepuffer zusammen, sie wird allerdings auch
andere Symbole in ihren internen Datenstrukturen dargestellt
haben, für die sie noch keine Codeworte erzeugt hat. Falls
somit zu einer beliebigen Zeit der Klient eine Codierung aller
Symbole, die noch nicht durch Codeworte dargestellt worden
sind, erzwingen will, und erzwingen will, daß diese Codeworte
an den Ausgabestrom geschickt werden, ruft er eine "CSFlush"-
Prozedur auf. CSUnsafePutBlock, CSPutChar und CSFlush kann
wiederholt in beliebiger Reihenfolge aufgerufen werden.
Schließlich kann der Klient, wenn er die Verwendung der
Kompressionseinrichtung beendet hat und ein letztes CSFlush
ausgegeben hat, durch Aufrufen einer "CSClose"-Prozedur den
Speicher, der von der Kompressionseinrichtung benutzt worden
ist, freigeben.
-
Analog hat die Expansionseinrichtung eine
"CreateDecodeingStream"-Prozedur, die als Argument den
Eingabestrom, von dem die Codeworte erhalten werden sollen,
umfaßt. Sie hat außerdem eine "ESUnsafeGetBlock"-Prozedur, die
aufgerufen werden kann, um Blöcke unkomprimierter oder
decodierter Quellsymbole zu erhalten, und eine "ESGetChar"-
Prozedur, die aufgerufen werden kann, um ein einzelnes
unkomprimiertes Quellsymbol zu erhalten. Außerdem hat die
Expansionseinrichtung eine "ESClose"-Prozedur, welche den
Speicher freigibt, den sie verwendet hat.
-
Wenn dieses Stromkompressionssystem verwendet wird, um eine
Datei zu komprimieren, wird CSFlush lediglich einmal, am Ende
der Datei verwendet. CSFlush erzeugt normalerweise entweder
ein PadCopy- oder PadLiteral-Codewort, wie es unten noch
erläutert wird; diese Codeworte sind der prinzipielle
Unterschied zwischen Strom- und
Dateikompressionseinrichtungen. Da diesen Codeworten eine sehr
niedrige Wahrscheinlichkeit zugewiesen wird, ist die
Codierung, die von der stromkompressionseinrichtung verwendet
wird, nahezu identisch mit der, die von einer äquivalenten
Dateikompressionseinrichtung verwendet werden würde, und die
erhaltene Kompression ist nahezu identisch. Es ist
verständlich, daß es der prinzipielle Vorteil einer
Stromkompressionseinrichtung ist, daß sie neben einer
Dateikompression in anderen Anwendungen verwendet werden kann,
wie zuvor diskutiert worden ist.
-
Wendet man sich nun der CSUnSafePutBlock-Prozedur der
Kompressionseinrichtung zu, die in Fig. 12 in Diagrammform
dargestellt ist, besteht der Suchbaum anfänglich aus Knoten
der permanenten Tiefe 1, einem leeren Fenster und einem leeren
Zeicheneingabepuffer; und die Tiefe der aktuellen
Übereinstimmung ist 0. Wenn Zeichen von CSUnsafePutBlock oder
CSPutChar zur Kompression übertragen werden, wächst der Baum
und das Fenster füllt sich, bis eine der drei Ressourcen
erschöpft ist; diese Ressourcen sind durch Größenparameter
maxCopyDisp (die Anzahl der Blätter oder Fensterpositionen in
dem Baum), maxNodes (die maximale Anzahl der in dem Baum
erlaubten Knoten) und oBufSize (die maximale Größe des
Zeicheneingabepuffers) definiert. Die Werte für maxNodes und
oBufSize werden normalerweise so gewählt, daß die meisten
Quelldaten, die maxCopyDisp Blätter erschöpfen, bevor sie
entweder den Knoten oder den Zeichenpuffer erschöpfen. In
diesem Fall erreicht die Kompressionseinrichtung schließlich
einen "Dauerbetrieb"-Betriebszustand, in dem auf jedes Kopie-
Codewort oder jedes Literalzeichen hin ein Blatt freigegeben
und ein Blatt zugewiesen wird. Für Text und andere Arten von
Daten wird der Grad der Kompression, der bei großen Quellen
erreicht wird, anwachsen, wenn maxCopyDisp anwächst. Die
beispielhafte Implementation in Anhang E verwendet eine
Fenstergröße von maxCopyDisp = 16384 Positionen, aber es ist
offensichtlich, daß diese Implementation für Werte von
maxCopyDisp zwischen ungefähr 1000 und 63000 voll
funktionsfähig ist.
-
Bei der Initialisierung der Kompressionseinrichtung und nach
einem CSFlush ist die längste Übereinstimmungstiefe 0. Der
Ausführung von CSUnsafePutBlock oder CSPutChar folgend, ist
allerdings die Tiefe der längsten übereinstimmung immer größer
als oder gleich 1. Wenn das nächste Zeichen zur Kompression
gesendet wird, wie in Schritt 101, versucht die
Kompressionseinrichtung zuerst die aktuelle längste
Übereinstimmung so zu erweitern, daß sie dieses Zeichen
einschließt, wobei die erweiterte Symbolkette in den Baum
eingesetzt wird, wie in den Schritten 102, 103, 104, 111, 113,
110 und 112 gezeigt. Der Suchpfad, dem während des Einsetzens
der erweiterten Symbolkette gefolgt wird, ist durch die
Position der aktuellen Übereinstimmung in dem Baum bestimmt.
Insbesondere wenn (1) die aktuelle Übereinstimmung auf einem
Leaf-Arc ist, wird der Suchpfad für die erweiterte Kette wie
in den Schritten 102, 111, 113 und 112 bestimmt, (2) die
aktuelle Übereinstimmung genau an dem Knoten ist, dann wird
der Suchpfad wie in den Schritten 102, 103, 110 und 112
bestimmt, oder die aktuelle übereinstimmung an einem internen
Arc des Baums vorliegt, dann wird der Suchpfad so wie in den
Schritten 102, 103, 104 und 112 identifiziert.
-
Wenn eine Übereinstimmung nicht weiter auf einen internen Arc
des Suchbaums erstreckt werden kann, wie in Schritt 104, oder
auf einem Leaf-Arc des Baums, wie in Schritt 111, wird ein
Knoten aus der freien Liste genommen und in den Baum bei dem
Punkt, an dem die Übereinstimmung abbricht, wie in Schritt 105
verspleißt Das neue Blatt wird dann an diesen neuen Knoten,
wie in Schritt 106, gehängt. Oder falls eine Übereinstimmung
nicht über einen existierenden Knoten, wie in Schritt 110,
erstreckt werden kann, dann wird das Blatt an den
exisitierenden Knoten, wie in Schritt 106, gehängt. Eine
Übereinstimmung wird außerdem abgebrochen, immer wenn sie die
maximal erlaubte Kopielänge oder die Tiefe auf einem Leaf-Arc,
wie in Schritt 113, erreicht. Unter diesen Umständen besteht
allerdings kein nützlicher Unterschied zwischen der neuen
Kette und dem vorherigen Auftreten, das zur Übereinstimmung
geführt hat, mit der Ausnahme einer zeitlichen Unterscheidung
und dem resultierenden Unterschied in ihren Positionen in
bezug auf das Suchfenster. Somit wird das alte Cutoff-Blatt
aus der Kette entfernt, wie in Schritt 114, und das neue Blatt
wird, wie in Schritt 106, an seine Stelle gesetzt. In den
Fällen, in denen ein Knoten aus der freien Liste erhalten
wird, wird eine Überprüfung durchgeführt, ob die freie Liste
leer ist, was anzeigt, daß alle Knoten in Gebrauch sind. Wenn
dies auftritt, wird ein neuer Knoten erzeugt und in die freie
Liste gesetzt, vorausgesetzt, daß die maximale
Knotenzuweisung, die durch den "maxNodes"-Parameter bestimmt
ist, noch nicht erreicht worden ist.
-
Schließlich werden die Baumpositionen, wie in Schritt 107,
aktualisiert, wobei mit dem Elternknoten für das neue Blatt
begonnen wird und in Aufwärtsrichtung in dem Baum gegangen
wird bis der Knoten mit der Permanenttiefe 1 erreicht ist. In
dieser Ausführungsform werden alle Knoten bis zur Wurzel
aktualisiert, es ist allerdings offensichtlich, daß eine
Perkolationsaktualisierung, wie sie obenstehend beschrieben
worden ist, verwendet werden kann. Außerdem können einige
Ausführungsformen die Knotenpositionen während dem Abstieg in
dem Baum aktualisieren.
-
An diesem Punkt ist der Baum aktualisiert worden und stellt
die neue Symbolkette richtig dar. Die nächsten Schritte sind
mit der Codierung der gerade in dem Baum dargestellten Kette
und mit der Vorbereitung zur Bestimmung der nächsten
Übereinstimmung asozuert. Wenn das Fenster voll ist, wird das
älteste Blatt aus dem Baum, wie in Schritt 108, entfernt, so
daß sein Speicher für das Blatt, das beim nächsten Mal erzeugt
wird, wieder verwendet werden kann (dieser Schritt ist
unnötig, falls die Kompressionseinrichtung ihr Fenster noch
nicht aufgefüllt hat, oder falls das Blatt bereits während des
Erreichens einer Cutoff-Tiefe, wie in Schritt 114, entfernt
worden ist, oder falls es bereits entfernt worden ist, um, wie
in Schritt 117, Platz in dem Puffer zu machen, oder falls es
bereits entfernt worden ist, weil die Anzahl der für den Baum
zugewiesenen Knoten erschöpft ist, wie in Schritt 121). Als
nächstes wird, wie in 115, die Codierung durchgeführt; diese
wird untenstehend und in Fig. 13 genauer erklärt.
-
Nach der Codierung überprüft die Kompressionseinrichtung ihren
Ausgabepuffer, wie in Schritt 116, um zu bestimmen, ob der
Puffer hinreichend freien Raum hat, um eine Kopie der maximal
erlaubten Kopielänge (im schlimmsten Fall für das nächste
Codewort) zu speichern. Falls nicht, werden die ältesten
Blätter aus dem Baum, wie in Schritt 117, entfernt, um
hinreichend Speicherplatz in dem Puffer für eine solche Kopie
plus einer zusätzlichen Menge an Speicher "oBufReserve" (siehe
Anhang E) frei zu machen. Insoweit jedes Blatt eines oder
mehrere Symbole in dem Puffer darstellt, macht ein Freigeben
eines Blatts außerdem Pufferplatz frei. Nachdem der
Ausgabepuffer überprüft worden ist, überprüft die
Kompressionseinrichtung, wie in Schritt 122, um zu bestimmen,
ob die Knotenliste frei ist (was impliziert, daß maxNodes
Knoten derzeit in dem Baum benutzt werden). Falls dies so ist,
entfernt sie die ältesten Blätter aus dem Baum durch einen
Stapel-Entfernprozeß "ToFree leaves" (der einen Parameterwert
von 100 hat). Ein Löschen eines Blatts bewirkt oft, daß ein
Elternknoten nur noch einen verbleibenden Sohn hat, so daß die
oben beschriebene Knotenlöschung oder der
Wiedergewinnungsprozeß verwendet werden kann, um den
Elternknoten wieder zu gewinnen und ihn in die freie Liste zu
setzen, aber es ist anzumerken, daß dieser Schritt wiederholt
wird, bis die freie Knotenliste ein oder mehrere freie Knoten
enthält. Es bleibt anzumerken, daß eine etwas einfachere
Variation der Kompressionseinrichtung die Schritte 121 und 122
von Fig. 12 durch Zuweisen einer Anzahl von Knoten, die größer
als oder gleich der Anforderung im schlimmsten Fall für
maxCopyDisp Blätter ist, eliminieren kann. In der Tat ist
diese Alternative als Bemerkung im Anhang E diskutiert und
wird in den Implementierungen gemäß den Anhängen C und D
verwendet. Allerdings ist der Nachteil dieses alternativen
Ansatzes, daß er die Speicheranforderungen für die
Kompressionseinrichtungen erhöht.
-
Schließlich wird das Zeichen, das gerade an die
Kompressionseinrichtung übertragen worden ist, welches die
längste Übereinstimmung nicht erweitert hat, das erste Zeichen
in einer neuen Übereinstimmung, wie in Schritt 123. Die
Baumposition wird so eingestellt, daß sie für dieses Zeichen
ein Knoten mit der permanenten Tiefe 1 ist, und die
Kompressionseinrichtung läuft dann in einer Schleife, um ein
anderes Zeichen anzunehmen.
-
Es ist verständlich, daß Fig. 12 entweder die
Kompressionseinrichtung in Anhang E oder die in Anhang D
darstellt; diese zwei Kompressionseinrichtungen unterscheiden
sich in den Codierungsdetails, die in der Codierfunktion 115,
die im folgenden erklärt wird, verborgen ist. Zusätzlich
verwendet die Kompressionseinrichtung in Anhang D die oben
diskutierte einfachere Variation, in welcher die Knoten
Verwaltungsschritte 121 und 122 dadurch eliminiert worden
sind, daß eine Anzahl von Knoten, die für die Anforderung im
schlimmsten Fall von "maxCopyDisp" Blättern ausreichend ist,
vorgesehen ist.
2. Ein Baumstrukturcodierer
-
Schritt 105 in Fig. 12 stellt den Codierungsabschnitt der
Kompressionseinrichtung dar; der gemäß einem Baum
strukturierte Codierer von Anhang E ist in Fig. 13 vollständig
in Diagrammform dargestellt. Die Aufgabe des Codierabschnitts
ist es, die Quelle kompakt mittels NodeCopy-, LeafCopy-,
Literal-, PadLiteral- und PadCopy-Codewörtern darzustellen.
Die Arten der verwendeten Codes sind vorteilhafterweise
Prefix-Codes, was bedeutet, daß kein Codewort ein Präfix eines
anderen ist, so daß die Expansionseinrichtung eindeutig den
Strom der Codeworte decodieren kann.
-
Für die Ausführungsform in Anhang C wird in den
Codierabschnitt einmal pro Zeichen eingetreten, unabhängig
davon, ob das Zeichen bereits durch ein Kopie-Codewort
dargestellt worden ist oder nicht, so daß eine Zeichen-
Übersprungzählung, wie in Fig. 3, in Schritt 78 verwendet
wird. Diese wird verwendet, um durch die Zeichen, die bereits
durch ein Kopie-Codewort dargestellt sind, herabzuzählen, bis
es Zeit ist, ein neues Codewort zu erzeugen. Außerdem
erfordern die Ausführungsformen in den Anhängen D und E diese
Übersprungzählung nicht, da in den Codierer für sie bei
Zeichen, die bereits codiert sind, nicht wiederholt
eingetreten wird.
-
Der Codierer entscheidet zuerst, wann das nächste Zeichen als
Literal dargestellt werden soll und wann es als Kopie
dargestellt werden soll. Falls die längste Übereinstimmung von
der Länge 1 ist, dann muß das Zeichen als Literal dargestellt
werden, wenn allerdings die längste Übereinstimmung von der
Länge 2 oder länger ist, dann kann die Strategie wählen, ob es
als Literal oder als Kopie dargestellt wird. Die
Ausführungsformen in den Anhängen C und D basieren diese
Strategieentscheidung nicht lediglich auf der Länge der
längsten Übereinstimmung; der Grund dafür ist, daß die
Codierung von einem Literal der Länge 1 4 Bits (plus dem
Zeichen) erfordert, während ein Literal der Länge 2 oder 3 6
Bits (plus dem Zeichen) erfordert; anders ausgedrückt, sind
die "Kosten" ein Literal zu initiieren 4 Bits, wohingegen die
Erweiterung von der Länge 1 zu der Länge 2 lediglich 2 Bits
kostet, und die Erweiterung von der Länge 2 auf 3 0 Bits
kostet. Aufgrund dieser Kostendifferenz vermeidet der Codierer
vorteilhafterweise die Initiierung eines Literals, wenn er
allerdings mit einem begonnen hat, vermeidet er es, diese für
eine Kopie abzubrechen; in anderen Worten gibt es
vorteilhafterweise eine "Hysterese" bei der Strategie-
Entscheidung. Diese Überlegungen führen zu der einfachen
Strategie, die obenstehend beschrieben worden ist, in der eine
Kopie der Länge 2 einem Literal vorgezogen wird, aber, wenn
ein Literal einmal begonnen worden ist, nur eine Kopie der
Länge 3 (oder ein Erreichen der maximalen Literallänge) dieses
stoppen kann. Man kann sich andere Strategien vorstellen, die
eine etwas höhere Kompression auf Kosten einer etwas größeren
Komplexität erreichen.
-
Im Fall des Baumstrukturcodierers nach Anhang E kommt
allerdings eine andere Betrachtung ins Spiel; es ist nämlich
wünschenswert, daß die Expansionseinrichtung in der Lage ist,
den Baum aus den Codeworten, die sie decodiert, wieder
herzustellen ohne Hashtabellen oder andere Datenstrukturen,
wie diejenigen der Kompressionseinrichtung zu verwenden. Zu
diesem Zweck ist es vorteilhaft, die Strategie immer auf die
Wahl einer Kopie zu beschränken, wenn die längste
Übereinstimmung von der Länge 2 oder länger ist, und ein
Literal nur zu initiieren oder zu erweitern, wenn die längste
Übereinstimmung kürzer ist; als Ergebnis dieser Beschränkung
wird die Expansionseinrichtung immer in der Lage sein, das
Blatt für einen Literaicharakter an den Knoten der permanenten
Tiefe 1, welcher dem Literalcharakter entspricht, zu hängen.
Als Ergebnis dieser Strategiebeschränkung, ist die
Expansionseinrichtung einfacher, läuft schneller und erfordert
weniger Speicher, obwohl sie typischerweise zu einer leicht
niedrigeren Kompression führt, als dies der Fall wäre, wenn
man einer komplexeren Strategie folgen würde.
-
Wendet man sich Fig. 13 zu, wird offensichtlich, daß die
Codierung von dem Kompressionsalgorithmus, der verwendet wird,
abhangig ist. Gemäß einem gemeinsamen Kennzeichen aller
bevorzugten Kompressionsalgorithmen wird außerdem zuerst, wie
in Schritt 127, bestimmt, ob ein Literal codiert wird oder
nicht. Zur Codierung eines Literals wird die Länge des
Literals, wie in Schritt 128, während jeder Iteration des oben
beschriebenen Einsetzprozesses erweitert, bis eine Kopie zu
codieren ist oder bis ein Literal von maximal erlaubter
Literallänge zusammengesetzt ist, wie in Schritt 129. Immer
wenn ein Literal seine maximal erlaubte Länge erreicht, wird
ein Literal-Codewort, wie in Schritt 131, sofort vor den
Literal-Symbolen, die akkumuliert worden sind, in den
Ausgabepuffer geladen. Ähnlich wird, wenn eine Kopie zu
codieren ist, die Zählung der akkumulierten Literallänge
überprüft, wie in Schritt 134, um zu bestimmen, ob ein Literal
zusammengesetzt worden ist. Falls dies der Fall ist, werden
ein Codewort, wie in Schritt 135, und die zusammengesetzten
Literal-Symbole vor dem Kopie-Codewort in den Ausgabepuffer
geladen (es wird daran erinnert, daß das Literal-Codewort und
seine angefügten Literal-Quellsymbole in den
Kompressionsausgabepuffer jederzeit, nachdem die Existenz der
Kopie bestatigt worden ist und bevor das Codewort für die
Kopie geladen ist, geladen werden können). Immer wenn ein
Literal ausgegeben wird, wird die akkumulierte Literal-Symbol-
Zählung bei 134 auf Null zurückgesetzt, so daß ein anderes
Literal zusammengesetzt werden kann.
-
In diesem Fall werden Kopien unter Verwendung einer LeafCopy
136 oder einer NodeCopy 137 in Abhängigkeit davon, ob die
Kopie an einem Leaf-Arc endet oder nicht, wie dies bei 138
bestimmt wird, codiert. Der Ausgabepuffer wird, wie in Schritt
139, überprüft, nachdem jedes Literal und jede Kopie in ihn
geladen worden ist, gesichert worden ist, wie in Schritt 140,
wenn er im wesentlichen voll ist. Die verschiedenen Details
der baumstrukturierten Codierung werden durch die Kommentare
in Anhang E beschrieben; eine zusätzliche Beschreibung der
Codierung erscheint im folgenden in der Diskussion der
Expansionseinrichtung.
3. Byte-Ausrichten des Codierers
-
Bezug nehmend auf Fig. 14 wird ein Flush-Prozeß verwendet, um
Codeworte für beliebige Teilliterale und/oder Kopien, die in
der Kompressionseinrichtung verblieben sind, wenn ein
Löschkommando ausgegeben worden ist. In einer
Dateikompressionseinrichtung wird ein solcher Befehl nur an
dem Ende der Datei ausgegeben, wenn es im allgemeinen
notwendig ist, die letzten paar Symbole der Datei aus der
Kompressionseinrichtung zu löschen, sogar wenn die
Kompressionseinrichtung nicht darauf vorbereitet ist, ein
herkömmliches Kopie- oder Literal-Codewort auszugeben, und wo
es nötig sein kann, die vorangehende Bitkette so abzubrechen,
daß sie nicht als ein Codewort fehl interpretiert wird. Für
eine Stromkompressionseinrichtung kann der Flush-Prozeß
außerdem verwendet werden, um einige zusätzlich komprimierte
Daten für einen Empfänger zu liefern, während die Quelldaten
für die Kompressionseinrichtung temporär erschöpft sind. In
jedem Kompressionseinrichtungstyp stellt das Löschen die
Byte- oder Wortausrichtung der komprimierten Daten wieder her (die
Ausführungsform nach Anhang E stellt die Ausrichtung auf eine
16-Bitgrenze wieder her).
-
Wenn ein Flush initiiert wird, wird der Normalbetrieb der
Kompressionseinrichtung temporär angehalten, und die Tiefe,
bei welcher der Suchbaum 73 (Fig. 3) zum Einsetzen des
nächsten Symbols oder Zeichen vorbereitet wird, wird
überprüft, wie in Schritt 141. Falls der Baum bereits auf
seine Wurzel gesetzt ist, wird der Flush abgebrochen, wie in
Schritt 142, und die Kompressionseinrichtung wird sofort in
den Normalbetrieb zurückgestellt. Andernfalls wird die Zählung
der akkumulierten Literale, wie in Schritt 143, überprüft und
ein Literal-Codewort wird, wie in Schritt 144, ausgegeben, um
die akkumulierten Symbole eines Literals, das durch das
Löschen unterbrochen wurde, zu begleiten. Nach der Ausgabe
eines zusammengesetzten Literals wird das älteste Blatt von
dem Baum, wie in Schritt 144, entfernt, falls es nicht bereits
gelöscht worden ist. Außerdem wird der Baum für die Symbole,
die durch das Pad-Codewort codiert worden sind, nicht
aktualisiert, da sie nicht einen eindeutigen Suchpfad
definieren. Als nächstes wird der Flush codiert, wie in
Schritt 145, unter Verwendung eines PadLiteral-Codewortes zur
Begleitung des einen Quellsymbol, das noch in der
Kompressionseinrichtung ist, falls sich der Baum bei einem
Knoten mit der Tiefe 1 befunden hat als das Löschen initiiert
worden ist, oder eines PadCopy-Codierworts, um die
Suchfenster-Symbolposition zu identifizieren und die Länge der
unterbrochenen Kopie, falls noch zwei oder mehr Symbole in dem
Baum sind, zu identifizieren. Das PadLiteral- oder PadCopy-
Codierwort wird in den Kompressionseinrichtungs-Ausgabepuffer
geladen, und zusätzliche Bits werden hinzugefügt, um die
Ausgabe des Puffers mit einer geeigneten Grenze auszurichten,
wie beispielsweise die nächste 16-Bit-Grenze in diesem
speziellen Beispiel. Schließlich wird der Puffer, wie in
Schritt 146, gesichert, und der Suchbaum 73 (Fig. 3) wird dann
auf seine Wurzel zurückgesetzt, wie in Schritt 147, um die
Kompressionseinrichtung zum Empfang weiterer Zeichen
vorzubereiten.
4. Eine Baumstruktur-Expansionseinrichtung
-
Entsprechend der Ausführungsform nach Anhang E der Erfindung
initialisiert ein Klient die Expansionseinrichtung dadurch,
daß er eine "CreateDecodeingStream"-Prozedur aufruft, die als
Argument einen Eingabestrom (oder eine Datenquelle) von dem
oder der Codeworte erhalten werden, umfaßt. Nach der
Initialisierung führt der Klient wiederholte Prozeduraufrufe
von "ESUnsafeGetBlock", die einen Zeichenblock liest, und von
"ESGetChar", die einzelne Zeichen liest, um unkomprimierte
oder erweiterte Symbole durch aufeinanderfolgendes Decodieren
von Codeworten aus dem Eingabestrom, wie er vom Klienten
übertragen wird, zu expandieren. "Esendof" kann verwendet
werden, um die Unfähigkeit des Expansionsstroms zur Lieferung
mehrerer Symbole zu überprüfen. Da die Implementierung von
"ESGetChar" einfach "ESUnsafeGetBlock" mit einer Symbol-
Zählung von 1 aufruft, wird die Beschreibung hier auf die
"ESUnsafeGetBlock"-Prozedur beschränkt, obwohl es verständlich
ist, daß eine ähnliche Beschreibung auch auf die "ESGetChar"-
Prozedur anwendbar wäre.
-
Wendet man sich den Fig. 15A und 15B, sieht man, daß die
Expansionseinrichtung ein Komplement zu der
Kompressionseinrichtung darstellt, um die originalquelldaten
genau wiederzugewinnen. Zu diesem Zwecke werden, wie oben
dargelegt, die Datenstrukturen der Expansionseinrichtung genau
wie die der Kompressionseinrichtung initialisiert. Außerdem
sind, immer wenn ein Codewort decodiert wird, der
Expansionsbaum und das Suchfenster mit dem Baum der
Kompressionseinrichtung zu entsprechenden Schritten des
Kompressionsprozesses identisch. Wie zu verstehen ist, werden
die zur Decodierung der Codeworte von der
Expans ionseinrichtung durchge führten Schritte vollständig
durch die Codierung bestimmt.
-
Die Expansionseinrichtung von Anhang E hat ein
Eingabeunterprogramm, um Bits aus seinem Eingabestrom zu
erhalten. Immer wenn mehr Bits für ein anderes Codewort oder
ein Literalzeichen erforderlich sind, wie in den Schritten
156, 159 und 160, dann wird dieses Unterprogramm aufgerufen,
um die Bits zu erhalten. Wenn der Eingabestrom vollständig
erschöpft ist, wird ein "EndOfStream"-Fehlerflag gesetzt,
wodurch bewirkt wird, daß die "ESUnsafeGetBlock"-Prozedur zu
ihrem Klienten mit einer Zeichenzählung, die kleiner als die
angeforderte ist, zurückkehrt Dies bewirkt das der Klient die
Expansion abbricht.
-
Die Expansionseinrichtung besitzt Statusvariablen, welches die
Pufferposition und die verbleibende Länge der aktuellen Kopie
sind, welche expandiert wird, falls eine vorhanden ist; oder
die verbleibende Länge des aktuellen Literals, das expandiert
wird, falls eines vorhanden ist. Wenn ein anderes Zeichen, wie
in Schritt 151, angefordert wird, überprüft zuerst
"ESUnsafeGetBlock" diese Variablen, um zu sehen, ob sie das
nächste Symbol ohne Decodierung eines anderen Codeworts
liefern kann. Falls eine NodeCopy, LeafCopy mit einer von Null
verschiedenen Arc-Verschiebung oder ein PadCopy Codewort
gerade expandiert wird, verwendet die Expansionseinrichtung
die bei 152, 153 und 154 dargestellten Schritte, um das
nächste Zeichen durch Kopieren desselben von einer anderen
Stelle in dem Zeichenpuffer zu liefern. Andererseits
verwendet, falls ein Literal-Codewort (d.h. ein LeafCopy mit
einer Arc-verschiebung von Null) gerade expandiert wird, die
Expansionseinrichtung die Schritte, die bei 152, 155, 156, 157
und 158 dargestellt sind, um das nächste Literalzeichen zu
expandieren.
-
Wie zu sehen ist, wird der Baum nach jedem Literalzeichen und
nach jedem Kopie-Codewort aktualisiert. Die Schritte
108',116', 117', 122' und 121' sind durch das Schaffen von
Blättern, Knoten und Pufferraum auf genau dieselbe Weise, wie
sie oben stehend im Zusammenhang mit der
Kompressionseinrichtung beschrieben ist, assoziiert.
Gleichermaßen bewirken die Schritte 108', 116', 117', 122' und
121', daß Blätter, wie in Schritt 157, andern Knoten der
permanenten Tiefe 1 des Expansionsbaums befestigt werden,
genau wie dies durch die Kompressionseinrichtung getan wurde.
Deshalb sind gestrichene Bezugszeichen, die denjenigen
entsprechen, die zur Beschreibung der Kompressionseinrichtung
verwendet worden sind, verwendet worden, um die ähnlichen
Schritte des Expansionsprozesses zu beschreiben.
-
Wenn die aktuelle Kopie oder das Literal erschöpft ist, ist es
zweckmäßig, daß nächste Codewort, wie 159, zu decodieren. Dies
führt dazu, daß dem Baum ein neues Blatt hinzugefügt wird,
falls das Codewort ein NodeCopy oder LeafCopy ist. Zusätzlich
wird außerdem dem Expansionsbaum ein Blatt für das erste
Zeichen eines jeden Literals hinzugefügt. Zur Vorbereitung für
diese möglichen Codewörter werden die Schritte 108', 116',
117' 122' und 121' wiederholt verwendet, um sicherzustellen,
daß die für das Blatt erforderlichen Ressourcen verfügbar
sind, und um sicherzustellen, daß während der Decodierung der
Baum der Expansionseinrichtung dieselbe Konfiguration hat, die
der Baum der Kompressionseinrichtung während der Codierung
hat.
-
Die Decodiereinrichtung, wie in Schritt 159, kann leicht ein
Cadewort von einem anderen unterscheiden, da die Codierung
eine Familie von Codes, die als "prefix codes" bekannt sind,
verwendet, was bedeutet, daß kein Codewort ein Prefix eines
anderen ist. Somit gibt es nur eine mögliche Interpretation
einer Bitsequenz. Insbesondere unterscheidet in der Codierung,
die durch Anhang E verwendet wird, das erste Bit des Codeworts
zwischen NodeCopy Codewörtern, LeafCopy-, Literal-,
PadCopy- und PadLiteral-Codewörtern. Falls dieses Bit ein NodeCopy
anzeigt, dann bestimmt die maximale Knotenanzahl bei der
Verwendung die Anzahl der Bits, die gelesen werden und als
Knotennummer unter Verwendung der oben diskutierten "sparse
coding"- Technik decodiert. Die Kriotenanzahl wird seinerseits
verwendet, um auf den Baum Bezug zu nehmen und die Länge des
in diesen Knoten einlaufenden Arcs zu bestimmen. Außerdem
bestimmt, falls der in dem spezifizierten Knoten einlaufende
Arc länger als ein Symbol lang ist, seine Symbollänge die
Anzahl der Bits, die als Arc-Verschiebung decodiert werden,
wiederum basierend auf der "sparse code"-Darstellung der
Bodenlänge. Es ist zu bemerken, daß die Decodierung der
Knotenanzahl erfordert, daß die Expansionseinrichtung den
selben Wert für die maximale Knotenanzahl wie die
Kompressionseinrichtung verwendet, und einen Baum hat, dessen
Knoten auf genau die gleiche Weise wie in der
Kompressionseinrichtung numeriert sind und verwendet werden.
-
Immer wenn das erste durch die Decodiereinrichtung
verarbeitete Bit, wie in Schritt 159, anzeigt, daß das
Codewort, das decodiert wird, keine NodeCopy ist, wird ein
monadischer < 1,1,12> -Code decodiert, mit der Ausnahme, daß das
größte oder Stopgrößen-Feld des Codes (d.h. ein monadisches
Codewort, das einen "Indikator" von 11 binären Einsern (d.h.,
11111111111) zum "Umschalten" aus dem monadischen Code
reserviert ist, so daß ein PadCopy- oder PadLiteral-Codewort
ausgegeben wird. Falls der decodierte Wert des monadischen
< 1,1,12> -Codes 0 ist, was ein Literal anzeigt, decodiert der
Decoder als nächstes einen monadischen (0,1,5)-Code als
Literallänge, um die Anzahl der Literal-Quellsymbole, die an
das Literal angehängt sind, zu bestimmen.
-
Falls der decodierte Wert des monadischen (1,1,12)-Codes in
dem Bereich [1..4094] liegt, wird er als eine Arc-Verschiebung
von dem Elternknoten eines Leaf-Arcs den Leaf-Arc abwärts
interpretiert. Somit wird die komprimierte Verschiebung in
diesem Fall basierend auf einem monadischen < 10-x, 2, 14-x>
und einer "Sparse"-Codierung" seines größten oder "Stop"-
Feldes, wie obenstehend für die Codiereinrichtung diskutiert,
decodiert.
-
In dem Fall, daß die Arc-Verschiebung ein PadCopy oder
PadLiteral bezeichnet, wird das PadCopy-Längenfeld unter
Verwendung eines monadischen < 1,1,12> -Codes decodiert. Falls
der decodierte Wert dieses Feldes Null ist, bedeutet dies, daß
das Codewort ein PadLiteral ist, dem ein einzelnes
Literalzeichen folgt. Andernfalls wird, nachdem die PadCopy-
Länge decodiert ist, die relative Verschiebung zur
Suchfensterposition des ersten oder des führenden Symbols der
längsten Ubereinstimmung unter Verwendung eines monadischen
< 10-x, 2, 14-x> -Codes mit der Sparse-Feld-Verbesserung für das
längste oder das "Stop"-Feld decodiert. Alle diese Details
stimmen mit den Codieroperationen, die durch die oben
beschriebene Kompressionseinrichtung durchgeführt werden,
überein.
-
Wenn die Decodiereinrichtung, wie 159, ein LeafCopy oder
PadCopy decodiert, erzeugt es eine komprimierte Verschiebung,
welche die Anzahl der komprimierten Positionen (d.h. die
Anzahl der Kopie-Codeworte oder Literalzeichen) zwischen der
aktuellen Fensterposition und derjenigen, bei der die längste
Übereinstimmung gefunden worden ist, entspricht. Die
komprimierte Verschiebung wird in eine komprimierte
Fensterposition oder äquivalent in eine Blattnummer dadurch
übertragen, daß die komprimierte Verschiebung von der
aktuellen Fensterposition modub der Windowgröße abgezogen
wird. Wenn die Decodiereinrichtung eine NodeCopy decodiert,
wird die komprimierte Fensterposition für den spezifizierten
Knoten aus dem Knoten in dem Baum erhalten. In all diesen
Fällen wird die komprimierte Fensterposition in eine
Zeichenpufferposition durch Lesen des "cWindow"-Feldeintritts
für die komprimierte Fensterposition (siehe Anhang E)
übertragen; diese übertragungen sind diagrammatische in Fig.
158 bei 162 und 170 gezeigt.
-
Dem Expansionseinrichtungsbaum wird als Antwort auf die
Decodierung eines PadLiteral- oder PadCopy-Codeworts kein
Blatt hinzugefügt. Die Gründe, warum dem Baum kein Blatt
hinzugefügt wird, sind für diese Ausführungsform des
Kompressionssystems spezifisch und werden in einem langen
Kommentar, welcher der "CSFlush procedure" in Anhang E folgt,
erklärt. Sie sind allerdings nicht hinreichend relevant für
die Erfindung, um eine weitere Diskussion zu rechtfertigen. In
der Tat wird ein Fachmann auf dem Gebiet der Programmierung
erkennen, daß es eine Vielzahl von Wegen zur Implementierung
der Pad-Funktion gibt. Nichts desto Trotz ist die Funktion
wichtig, so daß zu bemerken ist, daß die Expansionseinrichtung
das einzelne Symbol aus einem PadLiteral-Codewort in den
Zeichenpuffer, wie in dem Kasten 160, setzt, und dann den
Eingabestrom bei einer 16-Bitwortgrenze, wie in Schritt 161,
dadurch ausrichtet, daß Bits von dem Eingabestrom bis zur
nächsten ausgerichteten 16-Bit-Position übersprungen werden.
Gleichermaßen übersetzt als Antwort auf ein PadCopy die
Expansionseinrichtung die PadCopy-komprimierte Verschiebung in
eine Zeichenpufferposition (wie obenstehend diskutiert) und
sichert die PadCopy-Länge, wie in Schritt 162. Es richtet dann
bei einer 16-Bit-Grenze aus, geradeso wie fur ein PadLiteral,
bevor der Prozeß dadurch abgeschlossen wird, daß die Symbole,
die durch PadCopy dargestellt werden, wie 153 und 154 in den
Puffer kopiert werden.
-
Wenn die Decodiereinrichtung, wie in Schritt 159, ein LeafCopy
decodiert hat, übersetzt es als nächstes die komprimierte
Verschiebung in eine Blattnummer oder eine Fensterposition,
wie obenstehend diskutiert. Dann folgt sie dem Eltemzeiger
von dem angezeigten Blatt in dem Baum auf den Elternknoten des
Blatts (wie zu verstehen ist, sind die Tiefe dieses Knotens
plus die Arc-Verschiebung die Anzahl der Zeichen, die kopiert
werden). Falls, wie in Schritt 113, bestimmt wird, daß die
errechnete Kopielänge gleich der maximal erlaubten Kopielänge
ist, wird das Cutoff-Blatt für die wiederauf tretende
Symbolkette von dem Baum entfernt, wie in Schritt 114', um
durch ein neues Blatt, wie in Schritt 106' ersetzt zu werden.
Wiederum kann man sehen, daß diese Aktionen genau den
äquivalenten Aktionen in der Kompressionseinrichtung
entsprechen. Falls, wie es normalerweise der Fall ist, die
maximal erlaubte Kopielänge nicht erreicht worden ist, werden
dann ein Blatt und ein Knoten dem Baum hinzugefügt, wie in
Schritt 164. Die Schritte 165, 166 und 167 sind mit einem
graduierlichen Anwachsen der Anzahl der in Verwendung
befindlichen Knoten assoziiert, solange bis die maximale
erlaubte Anzahl von Knoten "maxNodes" in Betrieb sind (sie
schaffen eine etwas detailliertere Betrachtung der Funktion
des Schritts 105 in der Kompressionseinrichtung). Nach diesen
Überprüfungen der Liste für freie Knoten, die sicherstellen,
daß die Liste für freie Knoten nicht leer ist, es sei denn
maxNodes Knoten sind in Verwendung, werden die Baumpositionen
aktualisiert, wie in Schritt 107', genau wie in der
Kompressionseinrichtung bei 107, und die Fensterposition wird
in eine Zeichenpufferposition, wie in Schritt 170, durch Lesen
des "cWindows"-Feldes wie obenstehend diskutiert, übertragen.
Schließlich wird das erste Zeichen von LeafCopy, wie in den
Schritten 153 und 154, kopiert.
-
Wenn die Decodiereinrichtung eine NodeCopy decodiert hat,
werden die Tiefe und die Fensterposition des bezeichneten
Knotens aus dem Baum, wie in Schritt 169, erhalten. Falls die
Arc-Verschiebung Null ist, wie in Schritt 168 überprüft, dann
bricht die längste Übereinstimmung genau bei dem Knoten ab; in
diesem Fall wird, wie in Schritt 106', ein neues Blatt an den
bezeichneten Knoten angehängt. Andernfalls wird ein neuer
Knoten aus der Liste für freie Knoten erhalten und in den Baum
bei der bezeichneten Arc-Verschiebung von den Eltern des
bezeichneten Knotens eingesetzt, und das neue Blatt wird, wie
in Schritt 164, an den neuen Knoten gehängt. Die anderen
Schritte sind dieselben wie für eine LeafCopy, wie in den
Schritten 165, 166, 167, 107', 170, 153 und 154 angezeigt.
-
Nachdem ein Zeichen geliefert worden ist, läuft die
Expansionseinrichtung zu Schritt 151 zurück und läuft von dort
aus weiter.
Schlußfolgerung
-
Angesichts des vorangegangen kann man verstehen, daß die
monadische < Start, Schritt, Stop> -Codierung der vorliegenden
Erfindung eine Familie von Codewörtern variabler Länge
schafft, um komprimierte Daten, wie beispielsweise die Kopien
und Literale der verschiedenen
Textsubstitutionsdatenkompression-Prozesse, die hierin offenbart sind, zu codieren.
Die Textsubstitutionsdatenkompression ist allerdings nur ein
Beispiel eines Typs einer Datenkompression, in welcher die
monadische < Start, Schritt, Stop> -codierung zum Vorteil
verwendet werden kann.