Data compression method and apparatus

Abstract: In a data compression method based on an LZW coding procedure, a list (100, 101) which defines a sequence of tracing partial strings registered in a dictionary (220) is modified so that a position of a first registered partial string among the registered partial strings in a tree structure of registered partial strings is interchanged with a position of a second registered partial string among the registered partial strings in a state where the first and second registered partial strings extend from an identical node of the tree structure.

Description: The present invention generally relates to data compression schemes, and more particularly to a data compression method and apparatus based on the LZW algorithm. Recently, a variety of data, such as character codes, vector information and image information is processed by a computer. Further, the quantity of data processed by the computer is rapidly increasing. In order to efficiently process a large quantity of data at a high speed, it is necessary to exploit redundant parts of the data. A universal coding capable of compressing a variety of data by a single compression algorithm has been proposed. In this specification, data amounting to one word will be referred to as a "character", and data corresponding to a plurality of consecutive words will be referred to as a "character string". The Ziv-Lempel coding is known as one of the typical universal encoding procedures (see, S. Munataka, "Ziv-Lempel Data compression Algorithms", Information Processing, Vol.26, No.1, 1985, pp.2-6). A universal type algorithm and an incremental parsing algorithm have been proposed as suitable algorithms of the Ziv-Lempel encoding. Further, an LZSS code is known as an improvement in the universal type algorithm (see T. C. Bell, "Better OPM/L Text Compression", IEEE Trans. on Commun. Vol., COM-34, No.12, Dec. 1986, pp.1176-1182). Meanwhile, an LZW (Lempel-Ziv-Welch) code is known as an improvement in the incremental parsing algorithm (see T. A. Welch, "A Technique for High=Performance Data Compression", Computer, June 1984, pp.8-19). Out of the above-mentioned codes, the LZW code is used for file compression in a storage device because the algorithm thereof is simpler than the other algorithms. A description will now be given of the LZW coding with reference to FIGS.1, 2 and 3. More specifically, FIG.1 is a flowchart of an LZW coding procedure, FIG.2 is a flowchart of an LZW decoding procedure, and FIG.3 shows the LZW coding and decoding. In FIG.3, data (message) consisting of combinations of three characters 'a', 'b' and 'c' is processed for the sake of simplicity. Referring to FIG.1, the LZW coding is carried out as follows. At step S1, all partial strings, each consisting of a single character, are registered, as initial values, into a programmable dictionary. After that, the LZW coding starts. A reference number is assigned to each of the partial strings, each consisting of a single character. At step 1, the dictionary is retrieved by the the first input character K, and the reference number corresponding to the first input character K is obtained. The first input character is defined as a prefix string. At step S2, the second input character K subsequent to the first input character is input, and determined, at step S3, whether or not the first input character K existed. When the result at step S3 is YES, it is determined, at step S4, whether or not a partial string (ωK) obtained by adding the second input character K to the reference number ω of the first input character has been registered in the dictionary (or has been recognized). When the result obtained at step S4 is NO, at step S6 the reference number ω of the character K determined at step S1 is output as a code or code (ω) and the partial string (ωK) is registered, together with a new reference number, into the dictionary. Further, at step S6, the partial string obtained at step S2 is replaced by the reference number ω , and the procedure returns to step S2. Then, the dictionary address, labeled n, for inputting the consecutive characters one by one is incremented by 1. When the result obtained at step S3 is NO, the reference number ω is output as the code (ω) at step S7. In this way, the above-mentioned procedure is repeatedly carried out until it is recognized that the dictionary does not have any partial string (ωk). An example of the LZW coding will now be described with reference to (A) and (B) of FIG.3. Input data shown in (A) of FIG.3 is read from left to right. The first character 'a' is searched for in a dictionary 10. It will be noted that three partial strings 'a', 'b', and 'c' have been registered before starting coding. Since the first character has been registered in the dictionary 10, its extended string obtained by adding the second input character to the first input character, namely, 'ab', is searched for in the dictionary. At this time, the dictionary 10 does not have any extended strings. Thus, the code (ω), that is, code 1 is output for this string, and reference number 4 is assigned to the partial string 'ab'. In actuality, the reference number 4 is registered in the form of ωK. That is, the partial string 'ab' is described as 1b. Then, the second input character b is used to start the next string. Since its extension 'ba' is not in the dictionary 10, it is put there under reference number 5, the code for 'b' is output, and 'a' starts the next string. The above-mentioned process continues straightforwardly. Referring to FIG.2, the LZW decoding procedure, which is the reverse procedure of the LZW coding procedure, is carried out as follows. At step S11, all partial strings, each consisting of one character, are registered, together with respective reference numbers, in a dictionary on the decoding side. At step S1, the first code (reference number) is read, and a variable CODE indicating the current code is replaced by a variable OLDcode. Since the first code always corresponds to the reference number of one of the characters already registered in the dictionary, the character Code (K) corresponding to the variable CODE is searched for, and the character K is output. The output character (K) is written into a variable FINchar used for an exception procedure at step S18, which will be described in detail later. At step S12, the next (second) code is read, and written, as INcode, into the variable CODE. At step S13, it is determined whether or not any code input existed. When the result at step S13 is NO, the procedure ends. On the other hand, when the result at step S13 is YES, it is determined, at step S14, whether or not the code CODE defined at step S12 has been defined (registered) in the dictionary. When the result obtained at step S14 is NO, the procedure proceeds to step S15, at which step it is determined whether or not the partial string (ωk) corresponding to the code CODE has been registered in the dictionary. When the result at step S15 is YES, the partial string K is temporarily stacked, and the reference number code (ω) is written into the variable CODE. Then, the procedure returns to step S15. Steps S15 and S16 are repeatedly carried out until the reference number ω becomes equal identical to a single character. When the result at step S15 becomes YES, the characters stacked at step S16 are output by an LIFO (Last In First Out) process. At the same time, a new reference number is assigned to a partial string (ωK) consisting of the previously used code ω and the first character of the partial string decoded this time. An example of the LZW decoding procedure will be described with reference to (C) and (D) of FIG.3. The first input code is 1, as shown in (D) of FIG.3, and the reference numbers of the characters 'a', 'b' and 'c' have been respectively registered as 1, 2 and 3 in the dictionary, as shown in (C) of FIG.3. Thus, the first input code 1 is replaced by the partial string 'a' having reference number 1. The next (second) input code 2 is replaced by the character 'b' in the same way. At this time, the combination of the previously processed code 1 and the presently processed code 2, that is, '1b' is assigned reference number 4, which is registered in the dictionary 10 on the decoder side. The third input code 4 is replaced by '1b' and then 'ab' by retrieving the dictionary 10. At the same time, a partial string '2a' (='ba') corresponding to the combination of the previously processed code 2 and the first character 'a' of the partial string processed this time is assigned reference number 5, which is registered in the dictionary 10. The above-mentioned process continues straightforwardly. The LZW decoding procedure has an exception process. This exception process is needed for decoding the sixth input code 8. The code 8 is not registered in the dictionary 10 during the above-mentioned procedure, so that it cannot be decoded. In this case, partial string '5b' is obtained by adding the first character of the partial string 'ba' previously decoded to the code 5 previously processed, and is further replaced by '2ab' and then 'bab'. Then, the partial string '5b' obtained by adding the first character of the partial string 'ba' to the code 5 previously processed is registered, together with reference number 8, in the dictionary 10. The above-mentioned exception process is executed by steps S14 and S18 shown in FIG.2. Finally, at step S17, the partial string 'bab' is output and the combination (ω, K) is registered, together with the corresponding reference number, in the dictionary 10. The LZW coding and decoding procedures respectively shown in FIGS.1 and 2 are carried out while the same dictionary is being created. However, it takes a long time to search for one partial string by the LZW coding and decoding procedures. In the worst case, it is necessary to retrieve the entire dictionary 10. In order to eliminate this problem and speed up the coding and decoding procedures, an open hashing (chaining) method for dictionary retrieval has been proposed (see "Information Processing Handbook", The Institute of Information Processing, Ohm Corporation). FIG.4 shows an outline of the open hashing method. The open hashing method defines a hash function for obtaining the address indicating a storage area in which an element x (character string) of a set S made up of character strings on the basis of the element x. The element x is stored in the storage area indicated by the address obtained by the hash function. When storage areas (a hash table) are assigned addresses 0 to m-1, the following hash function, labeled h, is defined as follows: h : S → [0, 1, ..., m-1]. The address of the element (character string) x in the set S is determined by a hash address h(x). Normally, the hashing procedure is employed in a case where the size of the set S is much greater than m. Even if any hash function h is selected, there is a possibility that h(x1) = h(x2) where x1 and x2 are different character strings in the set S. This is called collision. The open hashing method can cope with such collision. According to the open hashing method, as shown in FIG.4, a list is provided for each hash address i, and the character strings x which satisfy h(x) = i are put in the same list from the head (beginning) of the list. The list having the same hash address is called a bucket. FIGS.5, 6 and 7 show a conventional LZW coding procedure based on the open hashing method. More specifically, FIG.5 shows a tree structure for dictionary retrieval, FIG.6 shows the state of a partial string table 10b and the state of an open hash table 10b, and FIG.7 shows a conventional LZW coding procedure using the open hashing method (see "Hard Disk Cook Book", AP-Labo Inc., Shoeisha, August 15, 1987, pp. A-28 - A-34). Referring to FIG.6, the partial string table 10b stores a character code for each index i and a character (extension character) Ext[i]. The open hash table 10a consists of two table parts 100 and 101. The table part 100 defines a sequence First, and the table part 101 defines a sequence Next. The table part 100 corresponds to the index dictionary shown in FIG.4, and the table part 101 corresponds to the linked lists (buckets). The component of the sequence First, First[i], indicates the index (address) showing the first partial string positioned at the beginning of the list specified by the index (reference number) i, and the component of the sequence Next, Next[i], indicates the index (pointer) showing an element which corresponds to a "brother" of the element of the reference number i. The component of the sequence Ext, Ext[i] indicates an extension character added to the ith element of the partial string table. The open hashing method is intended to calculating, at a high speed, the reference number of a partial string obtained by adding the extension character to the reference number (hash address) i of the previously encountered partial string. The hash table 10a is retrieved by the hash address of the partial string obtained by adding the extension character to the reference number (hash address) i. The list includes information about the extension character which is added to the reference number i. The extension character is compared with the input character K. When both the characters are different from each other, the next extension character indicated by the pointer (address) Next[i] of the extension character which is determined not to be identical to the input character is compared with the input character K. In this way, it is possible to retrieve all one-character-added partial strings which have been encountered. When all one-character-added partial strings have been checked and they do not coincide with the K added partial string, an linked address 0 is finally obtained, so that it is recognized that the identical partial string is not registered. Referring to FIG.5, a description will now be given of a procedure for searching for 'ahf' when partial strings 'ab', 'ah', 'az', 'abf', 'ahd', 'ahf' and 'azc' have been registered in the dictionary. The initial state of the partial string table 10b and the open hashing table 10a are as shown in FIG.6. The first character 'a' has been registered in the dictionary. In order to search for the second character 'h', the component First[i=a] of the sequence First is referred to by the hash address 'a', so that P1 is obtained. Thereby, the partial string 'ab' starting from 'a' indicated by the index P1 is found. However, the second character of the partial string 'ab' is not the same as that of the partial string 'ahf'. Then, the sequence Next is retrieved by the hash address P1, so that P2 is obtained. The partial string indicated by the index P2 is 'ah', the second character of which is the same as that of the partial string 'ahf'. Then, the third character 'f' of the partial string 'ahf' is searched for. The sequence First is retrieved by the hash address P2, so that P6 is obtained. The third character of the partial string indicated by P6 is 'd', which is not the same as that of the partial string 'ahf'. Thus, the sequence Next is retrieved by the hash address P6, so that P7 is obtained. The third character of the partial string indicated by P6 is 'f', which is the same as that of the partial string 'ahf'. The route for retrieving the partial string 'ahf' is composed of paths 1 ○, 2 ○, 3 ○ and 4 ○ in this order, as shown in FIG.5. FIG.7 shows the above-mentioned LZW coding procedure. At step S20, the dictionary is initialized so that each one-character contained in the input character string is registered. Then, the reference number assigned to the partial string which is next to be registered is written into the variable n. For example, the reference numbers 1, 2 and 3 respectively assigned to characters 'a', 'b' and 'c' are registered in the dictionary, and reference number 4 is written into the variable n. A maximum number of partial strings Nmax is determined, and the aforementioned sequences First, Next and Ext, each having the maximum number of partial strings are defined. Initially, zero is written into the sequences First, Next and Ext as the initial values. The ith component First[i] of the sequence First shows the number indicating a component of the sequence Ext located at the head of the list corresponding to the node indicated by the reference number i. The ith component Ext[i] of the sequence Ext shows extension character K of an element indicated by the reference number i. Further, the ith component Next[i] has a pointer indicating an element corresponding to a "brother" of the element indicated by the reference number i. The first character (prefix string) K is read, and the reference number thereof is written into the variable i. Then, the coding procedure starts. At step S21, the next character subsequent to the first character is read as the extension character K. At step S22, it is determined whether or not the first input character K existed. When the result at step S22 is YES, a dictionary retrieval procedure 50 consisting of steps S23 - S27 is executed. At step S23, the variable i is saved in another variable ω, and an initial value "0" is written into the variable j. At step S24, the number of the component of the sequence Next indicated by the value of the component First[i] corresponding to the variable i is written into the variable i. At step S25, when it is determined that the value of the variable i is not "0", the retrieval procedure for the corresponding list is started. The corresponding list contains one or more candidate elements. At step S26, the component Ext[i] is compared with the extension character K. When the result at step S26 is NO, at step S27 the value of the variable i is saved in the variable j, and the component Next[i] serving as a pointer which shows the next candidate element is written into the variable i. By repeatedly executing steps S25 - S27, the corresponding list is retrieved. When it is determined, at step S26, that Ext[i] = K, it is determined that the partial string identical to the input character string has been registered in the dictionary. In this case, the procedure returns to step S21, and the coding procedure for a character string with the next character input at step S21 added is carried out. On the other hand, when the component First[i] or the component Next[i] corresponding to the variable i is "0", the result at step S25 is YES. In this case, it is recognized that the dictionary does not have any candidate element which is to be linked to the partial string indicated by the reference number i. In this case, a dictionary registration procedure 60 consisting of steps S29 - S32 is executed. The reference number corresponding to the partial string retrieved at step S23 is saved in the variable ω each time the partial string is retrieved. Thus, the reference number saved in the variable ω shows the already encountered partial string which makes a longest match with the input character string. At step S28, a code corresponding to the reference number ω is output, and the new partial string is registered in the dictionary by the steps S29 - S32. At step step S29, the value of the variable n is written into the variable i, and then incremented by 1. Further, the component Ext[i] corresponding to the variable i is set to the extension character K. At step S30, it is determined whether or not the value of the variable j is "0". When the result at step S30 is YES, at step S31 the value of the variable i is written into the component First[ω] and the list corresponding to the reference number ω is defined. On the other hand, when the result at step S30 is NO, the value of the variable i is written into the component Next[ω], the new "brother" is added to the list being considered. At step S33, the reference number corresponding to the extension character K is written into the variable i, and the procedure returns to step S21. When there is no character which is to be input, a code corresponding to the variable ω obtained at this time is output at step S34, and the procedure ends. However, the above-mentioned conventional coding method has the following disadvantages. First, it is not designed to modify the open hash table 10a shown in FIG.6. That is, it is not designed to change the position of each partial string in the tree structure. Thus, if a partial string which is frequently retrieved is registered at a deep position available via a long route from the root of the tree structure, it takes a long time to access such a partial string because this route must be traced each time it is searched for, so that the retrieval procedure is not executed efficiently. When the coding rate is equal to about 10KB/s, it is impossible to code the input character string in real time so that the coding procedure matches a transfer speed (a few of 100KB/s to 1MB/s) at which coded data is transferred to a storage device, such as a magnetic disk drive or magnetic disk tape device. Second, since each partial string is registered in the tree structure in the order of appearance, if a partial string which is frequently retrieved is registered at a position away from the root of the tree structure, the same problems as described above will occur. Third, the conventional coding procedure is not designed to change the route for retrieval. Thus, the same problems as described above take place. It is a general object of the present invention to provide an improved data compression method and apparatus in which the above-mentioned disadvantages are eliminated. A more specific object of the present invention is to provide a data compression method and apparatus capable of efficiently executing coding at a higher speed. According to a first aspect of the present invention there is thus provided a data compression method comprising the steps of: (a) determining whether or not an input partial string which corresponds to a part of an input data string coincides with any of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in an order in which said registered partial strings appear and being assigned reference numbers, said list being provided for each node of said tree structure; (b) coding said input partial string which makes a longest match with one of said registered partial strings by the reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and (c) assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said method comprises a step (d) of modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged, when accessed, with the position of a second registered partial string, said second registered partial string being ordered prior to the first registered partial string in the list before rearranging, said first and second registered partial strings extending from an identical node of said tree structure. According to a second aspect of the invention there is provided a data compression apparatus comprising: first means for determining whether or not an input partial string which corresponds to a part of an input character string coincides with any of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in the order in which said registered partial strings first appear and being assigned reference numbers, said list being provided for each node of said tree structure; second means, coupled to said first means, for coding said input partial string which makes a longest match with one of said registered partial strings by a reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and third means, coupled to said first and second means, for assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said data compression apparatus comprises fourth means, coupled to said first means, for modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged upon being accessed with the position of a second registered partial string, said second registered partial string being ordered prior to the first registered partial string in the list before rearranging, said first and second registered partial strings extending from an identical node of said tree structure. According to a third aspect of the invention there is provided a data compression method comprising the steps of: (a) determining whether or not an input partial string which corresponds to a part of an input data string coincides with any of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in an order in which said registered partial strings appear and being assigned reference numbers, said list being provided for each node of said tree structure; (b) coding said input partial string which makes a longest match, with one of said registered partial strings by a reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and (c) assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said method comprises the further steps of (d) recording the frequency of access of each of the registered partial strings and (e) modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged with the position of a second registered partial string so that they are rearranged in a decreasing order of recorded frequency of access, said first and second registered partial strings extending from an identical node of said tree structure. According to a fourth aspect of the present invention there is provided a data compression apparatus comprising: first means for determining whether or not an input partial string which corresponds to a part of an input character string coincides with any one of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in the order in which said registered partial strings first appear and being assigned reference numbers, said list being provided for each node of said tree structure; second means, coupled to said first means, for coding said input partial string which makes a longest match with one of said registered partial strings by a reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and third means, coupled to said first and second means, for assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said data compression apparatus comprises fourth means for recording the frequency of access of the registered partial strings and a fifth means, coupled to said first means, for modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged with the position of a second registered partial string so that they are rearranged in a decreasing order of recorded frequency of access, said first and second registered partial strings extending from an identical node of said tree structure. For a better understanding of the invention and to show how the same may be carried into effect, reference will now be made, purely by way of example, to the accompanying drawings in which:- FIG.1 is a flowchart of a conventional LZW coding procedure; FIG.2 is a flowchart of a conventional LZW decoding procedure; FIG.3 is a diagram of the conventional LZW coding and decoding procedures; FIG.4 is a diagram illustrating an open hashing method; FIG.5 is a diagram of a tree structure of a dictionary; FIG.6 is a diagram showing a partial string table and an open hashing table; FIG.7 is a flowchart of a conventional LZW coding procedure using the open hashing method for dictionary retrieval; FIG.8A is a diagram showing an outline of a first preferred embodiment of the present invention; FIG.8B is a diagram showing an outline of a second preferred embodiment of the present invention; FIG.8C is a diagram showing an outline of a third preferred embodiment of the present invention; FIGS.9A and 9B are respectively diagrams showing a first preferred embodiment of the present invention; FIG.10 is a flowchart of a coding procedure according to the first preferred of the present invention; FIGS.11A, 11B, 12A, 12B, 13A, 13B, 14A and 14B are respectively diagrams showing an example of the coding procedure according to the first preferred embodiment of the present invention; FIG.15 is a flowchart of a coding procedure according to a second preferred embodiment of the present invention; FIG.16 is a flowchart of the coding procedure shown in FIG.15 in more detail; FIGS.17A, 17B, 18A, 18B, 19A and 19B, 20A and 20B are respectively diagrams of an example of the coding procedure according to the second preferred embodiment of the present invention; FIGS.21A and 21B are respectively diagrams showing a third preferred embodiment of the present invention; FIGS.22, 23 and 24 are respectively diagrams of a coding procedure according to the third preferred embodiment of the present invention; FIGS.25A and 25B are respectively diagrams showing how a partial string table and an open hash table are modified. A description will now be given of the outline of the first preferred embodiment of the present invention with reference to FIG.8A. FIG.8A-(I) shows a conventional tree structure in which the partial strings are linked together in the order of appearance thereof. The tree structure shown in FIG.8A-(I) has a first level consisting of characters 'a' and 'b', and a second level having characters 'b', 'c' and 'a' linked to the character 'a' at the first level and characters 'a' and 'b' linked to the character 'b' at the first level. When the character 'a' indicated by symbol * is searched for in an order of 'a', 'b', 'c' and 'a', as shown in FIG.8A-(I). Meanwhile, according to the first preferred embodiment of the present invention, the retrieval order can be changed, as shown in FIG.8A-(II). The registration position of the character 'a' indicated by * in FIG.8A-(I) is interchanged with that of the character 'c' immediately prior to the character 'a' indicated by *, as shown in FIG.8A-(II). It will be noted that three characters 'b', 'c' and 'a' extending from the node 'a' is contained in the same list. Thereby, the character 'a' indicated by * is obtained via a route passing through characters 'a', 'b' and 'a' in this order. The above-mentioned interchanging procedure is carried out when the character 'a' indicated by * has a high frequency of appearance. FIG.9A shows a system structure of the first preferred embodiment of the present invention. The structure in FIG.9A is composed of a processor 210 and a dictionary (memory) 220. The dictionary 220 has the open hash table 10a and the partial string table 10b. The processor 200 operates in accordance with a procedure, which will be described in detail later. FIG.9B is a flowchart of a coding procedure according to the first preferred embodiment of the present invention. At step S201, the dictionary 220 is retrieved by using the open hash table 10a. At step S202, the open hash table 10a is modified so that the position of the partial string being searched for is interchanged with the position of a partial string immediately prior hereto, these partial strings have an identical hash address). At step S203, the retrieved partial string having a longest match with the input character string is output. FIG.10 is a flowchart of the coding procedure according to the first preferred embodiment of the present invention. In FIG.10, those parts which are the same as those shown in FIG.7 are given the same reference numerals. At step S20, the dictionary 220 is initialized so that each single character contained in the input character string is registered. That is, character code ℓ is registered in a storage area of the dictionary 220 indicated by an address m (= ℓ) of the dictionary 220. Then, the reference number assigned to the partial string which is next to be registered is written into the variable n. For example, the reference numbers 1, 2 and 3 respectively assigned to characters 'a', 'b' and 'c' are registered in the dictionary, and reference number 4 is written into the variable n. A maximum number of partial strings, is written into the sequences First, Next and Ext, so that sequences First[Nmax], Next[Nmax] and Ext[Nmax], each having the maximum number of partial strings, are defined. Initially, zero is written into the sequences First[Nmax], Next[Nmax] and Ext[Nmax] as the initial values. As has been described previously, the sequence First corresponds to the table 100 shown in FIG.6, and the sequences Next and Ext correspond to the tables 101 and 10b, respectively. The ith component First[i] of the sequence First shows the number indicating a component of the sequence Ext located at the head of the list corresponding to the node indicated by the reference number i. The ith component Ext[i] of the sequence Ext shows an extension character K of an element indicated by the reference number i. Further, ith component Next[i] has a pointer indicating an element corresponding to a "brother" of the element indicated by the reference number i. The first character K is read, and the reference number corresponding to the first character is written into the variable i. Then, the coding procedure starts. At step S21, the next (second) character subsequent to the first character is read as the extension character K. At step S22, it is determined whether or not the first input character K existed. When the result at step S22 is YES, a dictionary retrieval procedure 50A consisting of steps S23a - S27a is executed. At step S23a, the variable i is written into the variable ω , and 0 is written into the variable j. Further, the value of the variable i is saved in a position detection index ℓk. At step S24, the number of the component of the sequence Next indicated by the value of the component First[i] corresponding to the variable i is written into the variable i. At step S25, when it is determined that the variable i is not equal to zero, the retrieval procedure on the corresponding list is started. This list contains candidate elements. At step S26, the component Ext[i] is compared with the extension character K. When the result at step S26 is NO, at step S27a the value of the variable i is saved in the variable j, and the component Next[i] is saved in the variable i. Further, at step S27a, the value of the variable j is saved in the variable ℓk. By repeatedly executing steps S25 - S27a, the corresponding list is sequentially traced. When it is determined, at step S26, that Ext[i] = K, that is, when the extension character Ext[ ] is the input character K, it is determined, at step S35, whether or not ℓk = 0. When ℓk is not equal to 0, the input character K is found by the third linked index or a linked index after the third linked index. In this case, the aforementioned interchanging procedure is executed. More specifically, at step S36, the value of the variable i is written into Next[ℓk] of the index ℓk, the value of the variable j is written into Next[i], and the value of the variable Next[i] is written into Next[j]. Then, the procedure returns to step S21. On the other hand, when it is determined, at step S35, that ℓk = 0, the input character K is found by the second link index or a link index prior to the second link index. Thus, at step S37, it is determined j = 0. When j = 0, the input character K is found by the component First[i], that is, the first link index. In this case, it is not necessary to interchange the positions of the adjacent partial strings in the tree structure with each other. On the other hand, when j is not equal to 0, the input character K is found by the second link index or a link index after the second link index. At step S38, the component Next[i] of the index i of the sequence Next 101 is moved to the component Next[j] of the index j immediately prior to the component Next[i], and the component First[ω] of the index ω of the sequence First 100 is moved to the component Next[i]. Further, the index i is moved to the sequence First[ω]. By the procedure at step S38, the index i of the input character K is rewritten so that it indicates the head (beginning) of the list. On the other hand, when the component First[i] or the component Next[i] is zero, the result at step S25 is YES. In this case, it is recognized that the dictionary 220 has not registered any candidate element linked to the partial string indicated by the reference number i. In this case, a dictionary registration procedure 60 consisting of steps S29 - S32 is executed. The reference number corresponding to the partial string used at step S23 is saved in the variable ω each time the partial strings are retrieved. Thus, the reference number saved in the variable ω indicates a partial string which has been registered in the dictionary 220 and has a longest match with the input character string. At step S28, a code corresponding to the reference number ω is output, and the new partial string is registered in the dictionary 220 by the steps S29 - S32. At step S29, the value of the variable n is written into the variable i, and then incremented by 1. Further, the component Ext[i] corresponding to the variable i is set to the extension character K. At step S30, it is determined whether or not the value of the variable j is equal to zero. When the result at step S30 is YES, at step S31 the value of the variable i is written into the component First and the list corresponding to the reference number ω is defined. On the other hand, when the result at step S30 is NO, the variable i is written into the component Next[ω], the new "brother" is added to the list being considered. At step S33, the reference number corresponding to the extension character K is written into the variable i, and the procedure returns to step S21. When there is no character which is to be input, a code corresponding to the variable ω obtained at this time is output at step S34, and the procedure ends. Referring to FIGS.11A and 11B, a partial string 'azw' is searched for. The dictionary 220 shown in FIG.9A has the partial string table 10b, and the open hash table 10a consisting of a sequence First 100 and the sequence Next 101. The character z is written into K, and the sequences First and Next are referred to, so that the component (index) Next[i = P2] = P3 is obtained. Since Ext[P3] = z at this time, j = P2 and ℓk = P1. Thus, it is determined, at step 35, that ℓk is not equal to 0, so that the tree position of the character 'z' is interchanged with that of the character 'h' immediately prior to the character 'z', as shown in FIG.11A. That is, as shown in FIGS.12A and 12B, i = P3 is written into the component Next[ℓk = P1], Next[i = P3] = 0 is written into the component Next[j = P2], and j = P2 is written into the component Next[i = P3]. Further, the sequence Next[i] is written, as shown in FIG.12B. Then, the next character 'w' is input at step S21. The sequence First 100 and the sequence Next 101 are followed, as shown in FIG.13B, so that Next[P9] = P10 is obtained as the index. At this time, Ext[P10] = w, and j = P9 and ℓk = P8. Thus, it is determined, at step S35, that ℓk is not equal to 0, so that the position of character 'w' is interchanged with that of character 'g', as shown in FIG.13A. That is, i = P10 is written into Next[ℓk = P8], Next[i = P10] = 0 is written into Next[j = P9], and j = P9 is written into Next[i = P10]. Thereby, as shown in FIG.14A, the position of character 'g' is interchanged with the position of character 'w', and the sequence Next[i] is changed, as shown in FIG.14B. As has been described above, each time characters being retrieved are found one by one, the position of the partial string being considered is interchanged with that of the partial string which has the same hash address as the partial string being considered and which is immediately prior hereto. Thus, in the case shown in FIG.14A, the partial strings 'azc', 'azw' and 'azg' are referred to in this order, while the partial strings 'azc', 'azg' and 'azw' are referred to in this order in the case shown in FIG.13A. As a result, it is possible to dynamically create the dictionary on the basis of the frequency of appearance of partial strings. Various variations of the first embodiment of the present invention can be made. It is possible to use a format of the open hash table different from that using the seqence First and the sequence Next. It is possible to process coded data strings instead of character strings. A description will now be given of a second preferred embodiment of the present invention with reference to FIG.8B. The tree structure shown in FIG.8B-(I) is created by the conventional coding procedure. According to the second preferred embodiment of the present invention, the position of character 'a' indicated by * is interchanged with that of character 'b' positioned at the head of the second level extending from the character 'a' at the first level, so that the partial string 'aa' is positioned at the head of the list instead of the partial string 'ac'. Referring to FIG.15, step S202A is substituted for the aforementioned step S202 shown in FIG.9B. At step S202A, the open hash table 10a shown in FIG.9A is modified so that the partial string searched for is positioned at the head of the list for retrieval. FIG.16 is a flowchart of a coding procedure according to the second preferred embodiment of the present invention. In FIG.16, those parts which are the same as those shown in FIG.10 are given the same reference numerals. The flowchart in FIG.16 is obtained by omitting the steps S35 and S36 from the flowchart of FIG.10 and by replacing steps S23a and S27a in FIG.10 by steps S23 and S27 shown in FIG.7. Referring to FIGS.17A and 17B, partial string 'ahf' is searched for in the following way. In the case, the sequence First 100 and the sequence Next 101 of the open hash table 10a, and the partial string table 10b have respective data, as shown in FIG.17B. Character 'h' is input as the input character K, and the sequences First and Next are referred to, so that the component Next[i = P1] = P2 is obtained. Since Ext[i] = h at this time, the components Next are so that i = P2 and j = P1. Thus, the partial string 'ab' is interchanged with the partial string 'ah' at step S38 shown in FIG.16. That is, as shown in FIGS.18A and 18B, Next[i] = P3 is written into next[j = P1], First[ω = a] = P1 is written into Next[P2], and i(= P2) is written into First[ω = a]. Thereby, the tree structure shown in FIG.17A is modified to that shown in FIG.18A. Returning to step S21, the next character 'f' is input, and the sequence First 100 and the sequence Next 101 are referred to, as shown in FIGS.19A and 19B. Then, Next[P6] = P7 is obtained. At this time, the components Next are so that i = P7 and j = P6. Thus, the position of character 'f' in the tree structure is interchanged with that of character 'd' at step S38 shown in FIG.16. That is, Next[i] = 0 is written into Next[j = P6], First[ω = P2] = P6 is written into Next[i = P7], and i(= P7) is written into First[ω = P2]. Thereby, the tree structure shown in FIG.18A is changed to that shown in FIG.19A. A description will now be given of a third preferred embodiment of the present invention. FIG.8C shows an outline of the third preferred embodiment of the present invention. The frequency in appearance of each partial string (in other words, the number of times each partial string appears) is calculated, and the tree structure is modified based thereon. A numeral in a block attached to each character shows the frequency in appearance of each partial string. For example, as shown in FIG.8C-(I), partial string 'ab' appears 16 times, string 'ac' appears three times, and string 'aa' appears nine times. According to the third embodiment of the present invention, as shown in FIG.8C-(II), string 'aa' has a frequency of appearance higher than that of string 'ac'. Thus, string 'aa' is positionally interchanged with string 'ac'. FIG.21A shows a system structure of the third preferred embodiment of the present invention. In FIG.21A, those parts which are the same as those shown in the previous figures are given the same reference numerals. The dictionary memory 220 has the aforementioned open hash table 10a and a partial string table 10b′. As shown in FIG.21A, the partial string table 10b′ has a counter area and a carry flag area in addition to the aforementioned reference number (index i) and the extension character Ext[i]. The counter area stores the number of times that the corresponding partial string has been accessed. The carry flag area stores a carry flag indicating whether or not the value of the corresponding counter area has overflowed (that is, this value becomes greater than a predetermined threshold counter value). Referring to FIG.21B, the dictionary 220 is retrieved at step S201, and the counter value in the counter area corresponding to the partial string which is searched for is incremented at step S204. At subsequent step S205, it is determined whether or not the carry flag in the corresponding carry flag area is ON. When the result of this determination is affirmative, at step S206 the positions of the corresponding partial strings in the tree structure are interchanged with each other. FIG.22 is a flowchart of the entire coding procedure of the third preferred embodiment of the present invention. The processor 210 resets a counter (sequence) Cnt[ ] and a flag Flag[ ] to zero at step S40. Further, the processor 210 resets a variable outcnt for counting the number of coded characters to zero. Then, a maximum value of the variable outcnt is set equal to, for example 1kbytes. After that, a retrieval procedure comprised of steps S41 to S45 is executed as shown in FIG.23. At step 41 shown in FIG.23, the first character ω is input. The processor 210 inputs the next character K and increments the value of the variable outcnt by +1 at step S42. By the index formed of the partial string ω, the component First[ω] in the sequence First is referred to, and written into the variable i at step S44-1. At subsequent step S44-2, the index i is compared with K. When it is determined that the index i is not K, the component Next[i] of the sequence Next 101 is referred to at step S44-3. At subsequent step S44-4, it is determined whether or not i = 0. When i = 0, there is no candidate character. On the other hand, when i is not equal to zero, the procedure returns to step S44-2. When it is determined, at step S44-2, that i = K, it is recognized that ωk has been registered in the dictionary 220, and index i is written into the partial string ω at step S44-5. Further, at this step, the value of the counter Cnt[i] is incremented by 1, and the procedure returns to step S42. When ωK has not been registered in the dictionary 220, at step S46 shown in FIG.22, the new partial string ωK is registered in the dictionary 220 and code Code(ω) is output. At step S48, it is determined whether or not the value of the variable outcnt has become greater than the predetermined value MAX determined at step S40. When the result at step S48 is NO, the procedure returns to step S41. On the other hand, the result at step S48 is YES, the paths of the tree are rearranged at step S49. At subsequent step S50, the counter Cnt[ ], the Flag[ ] and the variable outcnt are reset to zero, and the procedure returns to step S41. As has been described above, the rearrangement of the paths of the tree is carried out when the value of the variable outcnt exceeds the predetermined value MAX. The retrieval is executed along the paths of the tree, and the longest partial string which is a part of the partial string being considered is searched for. Then, the above-mentioned longest match partial string is coded at the position of the tree where it is found. When the input partial string is not identical to the already registered longest match partial string, a new partial string is registered. Then, it is determined whether or not the number of characters indicated by the variable outcnt exceeds the predetermined value MAX. When the result of this determination is affirmative, the next partial string is retrieved. FIG.24 shows the procedure at step S49 shown in FIG.22 in detail. The rearrangement of the paths of the tree is carried out for a part of the tree structure in order to reduce the time necessary for the rearrangement. According to a simulation, the average depth of the tree structure is equal to 3 to 10, and it is sufficient to rearrange the paths in this range. The processor 210 shown in FIG.21A initializes a maximum depth DepthMax to 10 at step S49-1, and the index to 0 at step S49-2. At step S49-3, it is determined whether or not the component First[i] is equal to zero. When the result at step S49-3 is NO, it is recognized that a partial string has been registered for the index being considered. Thus, the processor 210 checks the depth Depth of the partial string specified by index i at step S49-4. That is, Next[i] is sequentially followed until the component of Next[i] becomes zero, and the number of characters in the finally obtained partial string is obtained from index i. At step S49-5, the depth Depth obtained at step S49-4 is compared with the maximum depth DepthMax. When Depth > DepthMax, the tree is too deep and the procedure proceeds to step S49-7 without executing the rearrangement process. On the other hand, when the result at step S49-5 is NO, the flag Flag[ ] is referred to, and the sequences First[ ] and Next[ ] are rewritten. The process at step S49-6 will now be described with reference to FIGS.25A and 25B. It is now assumed that the tree has partial strings 'ar', 'ad', 'ac' and 'aa' which appear in this order. In this case, the respective values of the counter Cnt[i] are 2, 6, 3 and 5. If the flag Flag[ ] are respectively 0, 1, 0 and 1, 'ad' and 'aa' which have high frequencies of appearance is forwardly shifted, so that the table shown in FIG.25A is rearranged as shown in FIG.25B. That is, the component First[a] is changed to P2 from P1, the component of next[p2] is changed to P4, the component of Next[P3] is changed to 0, and the component of Next[P4] is changed to P1. As a result of this rearrangement, the trees is followed in an order of P2, P4, P1 and P3. Then, the procedure proceeds to step S49-7. When it is determined, at step S49-3, that First[i] = 0, it is recognized that there is no registered partial string with respect to this index, the index i is incremented by 1 at step S49-7. At step S49-8, the index i is compared with the maximum value IndexMax. When the result is NO, the procedure returns to step S49-3. On the other hand, when the result is YES, it is recognized that all the registered characters are rearranged, and the procedure ends. The present invention is not limited to the specifically disclosed embodiments, and variations and modifications may be made without departing from the scope of the appended claims. The modifications of the dictionary shown in FIGS. 8A to 8C need not be made at all the tree layer levels but may be restricted to just a subset of the levels. The closer a particular level to the root of the tree the more effective is the application of modification to this layer.

Claims: A data compression method comprising the steps of: a) determining whether or not an input partial string which corresponds to a part of an input data string coincides with any of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in an order in which said registered partial strings appear and being assigned reference numbers, said list being provided for each node of said tree structure (50, 50A, S41-S45); b) coding said input partial string which makes a longest match with one of said registered partial strings by the reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings (S28, S34, S46); and c) assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary (60, S46), characterized in that said method comprises a step d) of modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged, when accessed, with the position of a second registered partial string, said second registered partial string being ordered prior to the first registered partial string in the list before rearranging, said first and second registered partial strings extending from an identical node of said tree structure (S36, S38, S49). A data compression method comprising the steps of: a) determining whether or not an input partial string which corresponds to a part of an input data string coincides with any of a plurality of registered partial strings which have been registered in a dictionary in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in an order in which said registered partial strings appear and being assigned reference numbers, said list being provided for each node of said tree structure (50, 50A, S41-S45); b) coding said input partial string which makes a longest match, with one of said registered partial strings by a reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings (S28, S34, S46); and c) assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary (60, S46), characterized in that said method comprises the further steps of d) recording the frequency of access of each of the registered partial strings and e) modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged with the position of a second registered partial string so that they are rearranged in a decreasing order of recorded frequency of access, said first and second registered partial strings extending from an identical node of said tree structure (S36, S38, S49). A data compression method as claimed in claim 1, wherein said step d) comprises modifying said list so that the position of the first registered partial string is interchanged with the position of the second registered partial string which is at a tree layer level identical to that of said first registered partial string and is immediately prior to the first registered partial string in the tree structure. A data compression method as claimed in claim 2, wherein said step e) comprises modifying said list so that the position of the first registered partial string to be accessed is interchanged with the position of the second registered partial string positioned at a tree layer level identical to that of said first registered partial string in advance of accessing registered partial strings located at said tree layer level. A data compression method as claimed in claim 1, wherein: said registered partial strings are accessed individually in accordance with data placed at the beginning of said list; and said step d) comprises modifying said list so that data which indicates the said second registered partial string and which is located at the beginning of said list is replaced by data which shows said first registered partial string. A data compression method as claimed in claim 2 or claim 4, wherein: said step e) comprises modifying said list on the basis of said frequency of accessing each of said registered partial strings. A data compression method as claimed in claim 2, 4 or claim 6, wherein: said data compression method further comprises the step of comparing the frequency with a predetermined threshold frequency; and said step e) comprises the step of modifying said list when it is determined that the frequency is higher than said predetermined threshold frequency. A data compression method as claimed in claim 2, 6 or 7, wherein said step e) comprises modifying said list so that said registered partial strings extending from an identical node are rearranged in a decreasing order of frequency. A data compression method as claimed in any preceding claim, wherein said list is modified at predetermined layer levels of said tree structure. A data compression method as claimed in any preceding claim, wherein said data compression method comprises the step of sequentially selecting one of lists respectively provided for the nodes in an order indicated by data stored in an index dictionary provided in said dictionary. A data compression method as claimed in any preceding claim, wherein said input partial string is a partial string made up of one of the reference numbers and an extension symbol subsequent to a partial string specified by said one of the reference numbers. A data compression method as claimed in any preceding claim, wherein coded data obtained at said step b) comprises an LZW, also called Lempel-Ziv-Welch, code. A data compression apparatus comprising: first means (210) for determining whether or not an input partial string which corresponds to a part of an input character string coincides with any of a plurality of registered partial strings which have been registered in a dictionary (220) in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in the order in which said registered partial strings first appear and being assigned reference numbers, said list being provided for each node of said tree structure; second means (210), coupled to said first means, for coding said input partial string which makes a longest match with one of said registered partial strings by the reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and third means (210), coupled to said first and second means, for assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said data compression apparatus comprises fourth means (210), coupled to said first means, for modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged upon being accessed with the position of a second registered partial string, said second registered partial string being ordered prior to the first registered partial string in the list before rearranging, said first and second registered partial strings extending from an identical node of said tree structure. A data compression apparatus comprising: first means (210) for determining whether or not an input partial string which corresponds to a part of an input character string coincides with any one of a plurality of registered partial strings which have been registered in a dictionary (220) in accordance with a retrieval order indicated by data stored in a list, said registered partial strings being arranged in a tree structure in the order in which said registered partial strings first appear and being assigned reference numbers, said list being provided for each node of said tree structure; second means (210), coupled to said first means, for coding said input partial string which makes a longest match with one of said registered partial strings by a reference number which has been registered in said dictionary and which has been assigned to said one of said registered partial strings; and third means (210), coupled to said first and second means, for assigning a reference number to a partial string obtained by adding extension data to said input partial string and registering said reference number in said dictionary, characterized in that said data compression apparatus comprises fourth means for recording the frequency of access of the registered partial strings and a fifth means (210), coupled to said first means, for modifying said list so that the position of a first registered partial string among said registered partial strings in the tree structure is interchanged with the position of a second registered partial string so that they are rearranged in a decreasing order of recorded frequency of access, said first and second registered partial strings extending from an identical node of said tree structure.

Inventors: CHIBA HIROTAKA, NAKANO YASUHIKO, OKADA YOSHIYUKI, YOSHIDA SHIGERU, CHIBA, HIROTAKA, NAKANO, YASUHIKO, OKADA, YOSHIYUKI, YOSHIDA, SHIGERU
Applicants: FUJITSU LTD, FUJITSU LIMITED
Application year: 1991
Main classification: H03M7
IPC codes: G06T9, H03M7