DE68927939T2 - Monadische Kodierung vom Start-Schritt-Stop-Typ für die Datenkomprimierung - Google Patents

Monadische Kodierung vom Start-Schritt-Stop-Typ für die Datenkomprimierung

Info

Publication number
DE68927939T2
DE68927939T2 DE1989627939 DE68927939T DE68927939T2 DE 68927939 T2 DE68927939 T2 DE 68927939T2 DE 1989627939 DE1989627939 DE 1989627939 DE 68927939 T DE68927939 T DE 68927939T DE 68927939 T2 DE68927939 T2 DE 68927939T2
Authority
DE
Germany
Prior art keywords
tree
length
symbol
copy
literal
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
DE1989627939
Other languages
English (en)
Other versions
DE68927939D1 (de
Inventor
Edward R Fiala
Daniel H Greene
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Xerox Corp
Original Assignee
Xerox Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Xerox Corp filed Critical Xerox Corp
Application granted granted Critical
Publication of DE68927939D1 publication Critical patent/DE68927939D1/de
Publication of DE68927939T2 publication Critical patent/DE68927939T2/de
Anticipated expiration legal-status Critical
Expired - Fee Related legal-status Critical Current

Links

Classifications

    • HELECTRICITY
    • H03ELECTRONIC CIRCUITRY
    • H03MCODING; DECODING; CODE CONVERSION IN GENERAL
    • H03M7/00Conversion of a code where information is represented by a given sequence or number of digits to a code where the same, similar or subset of information is represented by a different sequence or number of digits
    • H03M7/30Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction
    • H03M7/3084Compression; Expansion; Suppression of unnecessary data, e.g. redundancy reduction using adaptive string matching, e.g. the Lempel-Ziv method

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Compression, Expansion, Code Conversion, And Decoders (AREA)

Description

  • 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.

Claims (5)

1. Ein Datenkompressionsverfahren zum Konvertieren einer Sequenz von Datenwerten in eine Sequenz von Literalwerten und Kopie-Codeworten gemäß einer vorbestimmten Strategie, die bestimmt, wann Kopie-Codeworte anstelle von Literalwerten verwendet werden, dadurch gekennzeichnet, daß die Kopie-Codeworte Codeworte mit variabler Länge sind, die einem monadischen Start-, Schritt-, Stop-Code entsprechen, und daß jedes Codewort aus einem Datenfeld- Längendeskriptor und einem Datenfeld mit einer Bitlänge, die durch den Datenfeld-Längendeskriptor spezifiziert ist, zusammengesetzt ist.
2. Das Verfahren nach Anspruch 1, in welchem die Bitlänge des Datenfeldes eines jeden Codeworts einer arithmetischen Progression entspricht, die an ihrem unteren Extremaiwert durch einen spezifizierten Startwert und an ihrem oberen Extremalwert durch einen spezifizierten Stopwert begrenzt ist, wobei die Progression zwischen dem unteren Extremalwert und dem oberen Extremalwert entsprechend eines spezifizierten Schrittwerts variiert.
3. Das Verfahren nach Anspruch 1 oder 2, in welchem der Datenfeld-Längendeskriptor die Bitlänge des Datenfeldes durch Identifizieren der Anzahl der Schritte mit der spezifizierten Schrittlänge, die zu dem spezifizierten Startwert hinzugefügt werden, spezifiziert, so daß ein Codewort mit der spezifizierten Bitlänge gebildet wird.
4. Das Verfahren nach Anspruch 2 oder 3, in welchem jeder Schritt in dem Datenfeld-Längendeskriptor durch ein Bit mit einem ersten Logikpegel dargestellt wird, und der Datenfeld-Längendeskriptor von dem Datenfeld durch ein Bit mit einem zweiten Logikpegel immer dann getrennt ist, wenn das Datenfeld kürzer als der spezifizierte Stopwert ist.
5. Ein programmierbares Datenkompressionssystem, das zur Durchführung des Verfahrens nach einem der vorangegangenen Schritte programmiert ist.
DE1989627939 1988-04-29 1989-04-28 Monadische Kodierung vom Start-Schritt-Stop-Typ für die Datenkomprimierung Expired - Fee Related DE68927939T2 (de)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
US18769788A 1988-04-29 1988-04-29

Publications (2)

Publication Number Publication Date
DE68927939D1 DE68927939D1 (de) 1997-05-15
DE68927939T2 true DE68927939T2 (de) 1997-09-11

Family

ID=22690083

Family Applications (1)

Application Number Title Priority Date Filing Date
DE1989627939 Expired - Fee Related DE68927939T2 (de) 1988-04-29 1989-04-28 Monadische Kodierung vom Start-Schritt-Stop-Typ für die Datenkomprimierung

Country Status (3)

Country Link
EP (1) EP0340041B1 (de)
JP (1) JP3061278B2 (de)
DE (1) DE68927939T2 (de)

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5617517A (en) * 1994-09-20 1997-04-01 Seiko Epson Corporation Two-dimensional method and system for compressing bi-level images
JP4625929B2 (ja) * 2005-09-01 2011-02-02 新世代株式会社 ダイレクトメモリアクセスコントローラ
US7804428B2 (en) * 2008-11-10 2010-09-28 Apple Inc. System and method for compressing a stream of integer-valued data
US11284075B2 (en) * 2018-09-12 2022-03-22 Qualcomm Incorporated Prediction of adaptive loop filter parameters with reduced memory consumption for video coding
US11051017B2 (en) 2018-12-20 2021-06-29 Qualcomm Incorporated Adaptive loop filter (ALF) index signaling
US11502705B2 (en) * 2019-06-21 2022-11-15 Sap Se Advanced database decompression

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4677649A (en) * 1983-04-26 1987-06-30 Canon Kabushiki Kaisha Data receiving apparatus

Also Published As

Publication number Publication date
EP0340041A2 (de) 1989-11-02
EP0340041A3 (de) 1991-09-25
JP3061278B2 (ja) 2000-07-10
EP0340041B1 (de) 1997-04-09
JPH01314430A (ja) 1989-12-19
DE68927939D1 (de) 1997-05-15

Similar Documents

Publication Publication Date Title
DE68925798T2 (de) Datenverdichtung
DE4340591C2 (de) Datenkompressionsverfahren unter Verwendung kleiner Wörterbücher zur Anwendung auf Netzwerkpakete
DE69318064T2 (de) Verfahren und Vorrichtung zur Verwaltung von mehreren Wörterbüchern zur Datenkomprimierung mit Inhaltsadressierung
DE4437790B4 (de) Verfahren und Vorrichtung zur Verwendung von endlichen Automaten zur Durchführung einer Kanalmodulation und einer Fehlerkorrektur und einer Entropie-Kodierung
DE19622045C2 (de) Datenkomprimierungs- und Datendekomprimierungsschema unter Verwendung eines Suchbaums, bei dem jeder Eintrag mit einer Zeichenkette unendlicher Länge gespeichert ist
DE69429482T2 (de) Methode und Einrichtung zur Datenkompression
DE69413347T2 (de) Auf die Bytegrenze ausgerichtete Datenkomprimierung
DE69027606T2 (de) Vorrichtung zur datenkompression
DE3606869C2 (de) Vorrichtung zur Datenkompression
DE60033184T2 (de) Verfahren und Vorrichtung zur Datenkomprimierung von Netzwerkdatenpaketen unter Verwendung von paketweisen Hash Tabellen
DE69704362T2 (de) Datenkompressions-/dekompressionssystem anhand sofortiger zeichenfolgensucheverschachtelter wörterbuchaktualisierung
DE69527679T2 (de) Verfahren zur Datenkomprimierung und -Dekomprimierung
DE69510662T2 (de) Kompakte Quellencodierungstabellen für Codierungs-/Decodierungssystem
DE3850035T2 (de) Datenkomprimierungssystem mit Expandierungsschutz.
DE19742417B4 (de) Vorrichtung und Verfahren zur Durchführung von M-fachem Maschinenendzustands-Entropiekodieren bzw. Entropiekodieren mit einer Maschine mit finitem Zustand
DE69518022T2 (de) Vorrichtung und Verfahren für Lempel Ziv Datenkompression mit Verwaltung von mehreren Wörterbüchern in Assoziativspeichern
DE69802520T2 (de) Verfahren und vorrichtung zur verlustfreien datenkompression
DE10196890B4 (de) Verfahren zum Ausführen einer Huffman-Decodierung
DE69834695T2 (de) Verfahren und Vorrichtung zur Datenkompression
EP2068448B1 (de) Verfahren und Anordnung zur arithmetischen Enkodierung und Dekodierung mit Verwendung mehrerer Tabellen
EP1588493A2 (de) Blockdatenkompressionssystem, bestehend aus einer kompressionseinrichtung und einer dekompressionseinrichtung, und verfahren zur schnellen blockdatenkompression mit multi-byte-suche
DE69522497T2 (de) System und Verfahren zur Datenkompression
DE3750390T2 (de) Simultane Fehlererkennung bei der Kodierung durch arithmetische Datenkodierung.
DE69530182T2 (de) Datenkompressionsverfahren und Vorrichtung mit Expansionsschutz
DE68927939T2 (de) Monadische Kodierung vom Start-Schritt-Stop-Typ für die Datenkomprimierung

Legal Events

Date Code Title Description
8364 No opposition during term of opposition
8339 Ceased/non-payment of the annual fee