Abstract:
The invention is a compression method which provides the advantages of run-length compression while preserving the natural collating order of the data. The method of the invention replaces sequential repetitions of a target pattern beyond a threshold value followed by a single number which encodes both the repetition count and the collating relationship between the target pattern and the pattern which follows it in the uncollated sequence. In the preferred embodiment of the invention, the code is preceded by at least one repetition of the pattern. In the preferred embodiment of the invention, the numerical code is set as the difference between the run count and the threshold count if the following pattern is less than the target pattern, or if there is no following pattern. If the following pattern is greater than the compression sequence, the code is set as a predetermined number, preferably the maximum binary value of the sequence length, minus the difference between the run count and the threshold count.

Description:
FIELD OF THE INVENTION 
     This invention relates to an improved method for storing and retrieving data using a computer, and more specifically to an improved method for run-length data compression which preserves the natural collating order of the data which is compressed. 
     BACKGROUND OF THE INVENTION 
     Techniques for efficiently storing and searching large databases are increasingly important in a variety of communications and electronic data storage applications. Extremely large databases are logically structured to minimize the search times expected for typical searches of the database. For example, data will be stored in records in one portion of the data base, but, to save the necessity of searching each record in order to find one in particular, a key may be provided which points to the physical location of each record, or to the location of a particular type of data within that record. These keys are arranged in ordered indices using configurations, such as B-trees, which may be efficiently searched. When a particular piece of data in a particular record is sought, the key index is searched to identify the desired record, and then the record is searched to find the desired piece of data. Because this form of search is so much more efficient than a linear search through the entire database, large databases normally include a number of ordered indices designed to facilitate searching in all of the commonly expected modes. 
     In addition, physical data compression techniques are often employed to reduce hardware costs, storage space requirements, and data transfer times. They are particularly attractive for suppressing runs of repeating characters or patterns, such as the trailing blanks or space-holder characters at the end of a fixed-length data field. Since each data item must be first compressed, and later decompressed, a compression algorithm which is cumbersome to implement will offset many of the efficiencies provided by the reduction in size of the data base, and, in the worst cases, may actually reduce system performance. Run-length compression is a popular compression technique because it provides significant data compaction for repeating characters or patterns using very simple compression and decompression algorithms. In conventional run-length compression, sequential repetitions of a target pattern beyond a predetermined threshold are replaced by a special character which signals that compression follows, the compressed pattern, and a count of the number of repetitions. Frequent choices for compression are &#34;spacer&#34; characters, such as asterisks, underscores, dashes and space characters. Thus, a run-length compression of the spaces (represented as x&#39;s for easier visualization) in the data sequences: 
     BENxxxxxxxTHOMASxxxx 
     BEN-SUNGxxMARYxxxxxx 
     BENTLEYxxxJOHNxxxxMD 
     BENTLEYxxxJOHNxxxPHD 
     would yield (using  as the special compression character) the much shorter: 
     BEN ×7THOMAS ×4 
     BEN-SUNG ×2MARY ×6 
     BENTLEY ×3JOHN×4MD 
     BENTLEY ×3JOHN ×3PHD 
     However, conventional run length compression cannot be used with ordered data indices or other ordered data because it does not preserve the natural collating sequence of the data. This issue arises because the characters are represented, and manipulated, in the computer as binary codes, each of which corresponds to a numerical value. Different computers use different character set representations. For example, FIG. 3 shows the 8 bit ASCII character set representation, a standard representation commonly used in the industry. The bit representation is shown on the horizontal and vertical axes, with bits 1-4 on the vertical axis and bits 5-7 on the horizontal axis. The character represented by each combination of bits is shown in the grid, while the three small numbers next to each character in the grid, are the bit values in octal, decimal, and hexadecimal respectively. For example, the character A is represented by the bit sequence 1000001, which is &lt;101&gt; in octal, &lt;65&gt; in decimal and &lt;41&gt; in hexadecimal. For convenience, decimal values are used in this description, but this limitation is not required to implement the invention. Sequences of data may be collated in their &#34;natural&#34; sequence, which would be the numerical order of their bit values, or in a specially programmed collating sequence which maps the bit values to a different order. An example of a specially programmed sequence would be one in which the values &lt;65&gt;,&lt;66&gt;,&lt;97&gt;,&lt;98&gt; were always collated in the order ,&lt;65&gt;,&lt;97&gt;,&lt;66&gt;,&lt;98&gt; so that the intuitive (to people) ordering A,a,B,b was adhered to by the machine. Specially programmed collating sequences require added time and space in comparison with natural collating sequences, and also require that the natural collating order of the character set be known in advance to the programmer. However, the characters used as spacers and special compression characters tend not to collate naturally when concatenated with the alphanumeric characters, and tend not to be assigned the same relative character values in different character sets. 
     In the example shown above, the natural collating sequence of the compressed data would depend on what value the character  was assigned relative to the alphanumeric characters. In the ASCII character set shown in FIG. 3, the capital letters have the character values &lt;65&gt; to &lt;90&gt;, the numerals have the values &lt;48&gt; to &lt;57&gt;, --(dash) has the value &lt;45&gt;, space has the value &lt;32&gt;, and  has the value &lt;92&gt;. If the natural collating sequence of this character set were adhered to, the compressed sequence would collate as: 
     BEN-SUNG ×2MARY ×6 
     BENTLEY ×3JOHN ×3PHD 
     BENTLEY 3JOHN ×4MD 
     BEN ×7THOMAS ×4 
     Because the special compression character has a higher value than the letters or the dash, and because the compression count is collated as if it were a character in the sequence, the natural collating order would not be preserved. 
     If the special compression character were omitted because only one character was being compressed, a common situation in databases where there is a single spacer character which repeats much more frequently than any other character, the sequence would compress as: 
     BEN×7THOMAS×4 
     BEN-SUNG×2MARY×6 
     BENTLEY×3JOHN×4MD 
     BENTLEY×3JOHN×3PHD 
     and, again using ASCII as an example, would collate as: 
     BEN×7THOMAS×4 
     BEN-SUNG×2MARY×6 
     BENTLEY×3JOHN×3PHD 
     BENTLEY×3JOHN×4MD 
     Again, the natural collating order is lost due to the compression. In this instance, it is the run count, rather than the special character, which interferes with the natural collating sequence. Collating errors caused by the run count are very difficult to correct for by programming a special collating sequence, since the count can vary over a broad range of values. 
     The collating sequence limitation significantly restricts the possible areas of application for run length compression and forces data base and telecommunications system designers to rely on significantly less efficient compression techniques for data base key indices and other ordered or sortable data base structures. 
     SUMMARY OF THE INVENTION 
     The invention is a compression method which provides the advantages of run-length compression while preserving the natural collating order of the data. The method of the invention replaces sequential repetitions of a target pattern beyond a threshold value with a single repetition of the pattern followed by a single number which encodes both the repetition count and the collating relationship between the target pattern and the pattern which follows it in the uncollated sequence. 
     In a computer system comprising a data processing means, a memory means, and a data storage device containing data records, the invention is preferably implemented by selecting a target pattern for compression and a threshold count beyond which repetitions of the target pattern are to be compressed, reading a stream of data characters in sequence,comparing the characters with the target pattern and recording a run count of sequential repetitions of the target pattern, determining whether the run count exceeds the threshold count, and whenever it does, first determining whether the data pattern immediately following the run of target patterns in the data stream is greater than or less than the target pattern, and then replacing all repetitions of the target pattern in excess of the run count with a character string which includes a numerical code chosen to be the difference between the and the threshold count if the following pattern is less than the target pattern or if there is no following pattern, and to be a preselected number less the difference between the run count and the threshold count if the following pattern is greater than the target pattern. In the most preferred embodiment of the invention, the preselected number used is the maximum binary value of the sequence length. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     FIG. 1A is a general representation of the structure of an uncompressed data string suitable for compression in accordance with the invention. 
     FIG 1B is a general representation of the structure of the data string of FIG. 1A when compressed in accordance with the invention. 
     FIG. 2 is a flow chart of a compression procedure in accordance with a preferred embodiment of the current invention. 
     FIG. 3 is a chart of an 8 bit ASCII character set. 
     FIG. 4 is a flow chart of a decompression procedure in accordance with a preferred embodiment of the current invention. 
    
    
     DETAILED DESCRIPTION OF THE EMBODIMENTS 
     The present invention is intended to operate in a computer or telecommunications system comprising a data processing means, a memory means, and a data storage device containing data records. The data processing means may be, for example, a conventional computer or a microprocessor in a modem or other communications device. The data storage device may be, for example, a conventional disk drive or a buffer embedded in a modem. 
     The invention describes a method of operating the data processing means for compactly storing data while maintaining its natural collating sequence, and for efficiently restoring retrieved data to an uncompacted form using a general compression technique. In the following description, numerous specific details and examples are set forth in order to provide a thorough understanding of the present invention. It will be obvious, however, to one skilled in the art that variants are possible and that the invention may be practiced without adhering to these details in every particular. In some instances where well-known methods are employed, their details are omitted in order not to unnecessarily obscure the present invention. 
     Referring to FIG. 1A, there is shown generally the structure of an uncompressed data string containing repetitions of a target pattern and therefore suitable for compression in accordance with the present invention. In order to fully understand the present method, it should be understood that each symbol CV1, CV2, and CV3 represents the binary value of a character in a sequential data stream, S. The binary values chosen generally conform to one of a number of commonly used character sets, such as the ASCII character set shown in FIG. 3. Although ASCII has been used as an exemplary character set, the present invention is not limited to ASCII representation, and may be used with any character set. CV2 is serially repeated in the data stream a total of R1 times at its first occurrence, and R2 times at its second occurrence. 
     FIG. 2 is a flow chart of a compression procedure in accordance with a preferred embodiment of the current invention. In step 200 the procedure is started, and in step 202 the sequence which will be the target for compression is selected. The target may be either a single-octet character, such as the ASCII representation of the space character, a multi-octet character, such as may be found in representations of Japanese or Chinese characters, or even a run of repeating characters. 
     In step 204, a sequence length equal to the length of the target pattern is selected. Thus, if the target pattern is one single-octet character, the sequence length will be one, but if the target pattern is a character or sequence which fills four octets, the sequence length will be four octets also. In the present invention, the sequence length also determines the compression ceiling, the maximum run of target patterns which can be compressed at once. The compression ceiling for the preferred embodiment of the present invention is half of the maximum binary value which can be stored in the sequence length, plus one. Thus, for a one octet target pattern, the maximum binary value of the sequence length will be 255, and the compression ceiling will be 1/2(255+1)=128. Runs in excess of the ceiling may be broken apart for compression in accordance with the invention. In step 206, a threshold for repetitions of the target pattern is selected. In many instances, selecting a threshold of one will provide maximum compression benefits, but in a few instances, applying the method with a threshold of one will expand the data rather than compacting it and in these instances a threshold of two or greater may advantageously be selected. 
     In step 208, a counter is reserved to track sequential repetitions of the target pattern in the data stream, and this run count is initialized at zero. Data characters from the data stream are read sequentially by the procedure, one sequence length at a time. In steps 210 and 212, the data processing means determines whether data is present at the next spot in the data stream and if data is not present, the data processor proceeds to step 232, which will be discussed later. If data is present, the processor gets these next characters at step 214, and at step 216, compares the next characters to the target pattern. If the next characters match the target pattern, the run count is incremented by one at step 218, and the processor then advances one sequence length in the data stream and repeats steps 210 and 212 with new data. If however, the next characters do not match the target pattern, then after step 216, the processor tests at step 220 whether the current run count is lower than the predetermined threshold. If it is, the next characters are simply written into the data storage device at step 222 and the processor returns to step 208. 
     If, however, the threshold has been equaled or exceeded, then the compression sequence is begun. At step 224, the value of the next character is compared to the value of the target pattern. All of the comparisons shown in FIG. 2, and later in FIG. 4 are done in accordance with whatever collating sequence it is desired that the values will be ordered by. Thus, the present invention may be used even if a specially programmed collating sequence is being used instead of the natural collating sequence, merely by doing all comparisons in accordance with the specially programmed sequence. 
     If the target pattern is the lesser of the two values, then, as shown at step 228, a compression count is calculated as a predetermined number less the difference between the current run count and the threshold. The predetermined number is preferably the bit value of the sequence length. Thus, for a one octet sequence length, the predetermined number would be 255. If the target pattern is the greater of the two values, then a compression count is calculated as the difference between the current run count and the threshold, as shown at step 230. In either case, the target pattern, the compression count computed at step 228 or 230, and the next characters, which will be seen to be the pattern following the final repetition of the target pattern in the run of repetitions, are written into the data storage device and the processor returns to step 208. If the repetitions of the target pattern continue to the end of the data stream, then when the processor tests for next characters at step 212, it will find none and proceed to step 232. At step 232, the current run count is compared to the threshold. If the run count is below the threshold, the procedure ends at step 238. If the run count equals or exceeds the threshold, at step 234 a compression count is calculated as the difference between the current run count and the threshold, and at step 236, the target pattern and the compression count are written into the data storage device, and only then does the procedure end at step 238. 
     FIG. 3 shows the compacted structure of the data string of FIG. 1 when compressed in accordance with the invention. It will be recalled that a run of R1 repetitions of CV2 occurred between CV1 and CV3, and a run of R2 repetitions of CV2 occurred after CV3. For the purposes of this example, CV2 is taken to be one octet in length. If CV2 was selected as the target pattern and T as the threshold for repetitions, then regardless of the lengths of the two runs of CV2, the compacted data stream becomes only 6 characters long, with the encoded characters CC1 and CC2 representing, respectively, the first and second runs of CV2. CC1 will equal R2-T if CV3&lt;CV2 (in the selected collating sequence) or 255-(R2-T) if CV3&gt;CV2. CC2 will equal R2-T. 
     Applying the present invention to the example data discussed above demonstrates the improvement over prior art compression methods in maintaining the collating sequence of the data provided by the present invention. It will be recalled that the example data (in which space characters were represented as x&#39;s for ease of visualization), was: 
     BENxxxxxxxTHOMASxxxx 
     BEN-SUNGxxMARYxxxxxx 
     BENTLEYxxxJOHNxxxxMD 
     BENTLEYxxxJOHNxxxPHD 
     If this data were to be compressed in accordance with the invention, using the ASCII character set shown in FIG. 5, the space character as the target pattern, the natural collating sequence, and a threshold of 1, the compacted result would be: 
     BEN×&lt;249&gt;THOMAS×&lt;3&gt; 
     BEN-SUNG×&lt;254&gt;MARY×&lt;5&gt; 
     BENTLEY×&lt;253&gt;JOHN×&lt;252&gt;MD 
     BENTLEY×&lt;253&gt;JOHN×&lt;253&gt;PHD 
     This would collate naturally as: 
     BEN×&lt;249&gt;THOMAS×&lt;3&gt; 
     BEN-SUNG×&lt;254&gt;MARY×&lt;5&gt; 
     BENTLEY×&lt;253&gt;JOHN×&lt;252&gt;MD 
     BENTLEY×&lt;253&gt;JOHN×&lt;253&gt;PHD 
     leaving the desired collating order unchanged. 
     Because the natural collating order of the data is preserved by the compression operation, sorting and multiple search operations can be performed on the data without decompression, providing a significant increase in efficiency. However, once data is sorted or selected, it will normally be required by the user in non-compressed form. FIG. 4 shows a procedure for restoring compacted data in accordance with a preferred embodiment of the invention. 
     Turning now to FIG. 4, the procedure is started in step 300, and in step 302 the sequence which was used as the target for compression when the data was compacted is input or recalled. As earlier noted, the target pattern may be either a single character, such as a spacer character, a multi-octet character, such as may be found in representations of Japanese or Chinese characters, or even a run of repeating multi-octet characters. In step 304, a sequence length equal to the length of the target pattern is selected, and in step 306, the compression threshold which was used in compacting the data is input or recalled. 
     In step 308, a counter is reserved to track sequential repetitions of the target pattern in the data stream, and this run count is initialized at zero. Data characters from the data stream are read sequentially by the procedure, one sequence length at a time. In steps 310 and 312, the data processing means advances by one sequence length and determines whether data is present at the next spot in the data stream. If data is not present, the data processor ends the procedure. If data is present, the processor gets these next characters at step 314, and at step 316, compares the next characters to the target pattern. If the next characters match the target pattern, the run count is incremented by one at step 320, and the processor tests at step 322 whether the current run count is lower than the predetermined threshold. If either the next characters do not match the target pattern at step 216, or the run count is lower than the threshold at step 322, the next characters are simply written into the data storage device at step 318 and the processor then advances one sequence length in the data stream and repeats steps 310 and 312 with new data. If, however, the target pattern is matched and the threshold is reached, the decompression sequence is begun at step 324. 
     At step 324, the processor advances one sequence length to read the pattern of characters first following the characters just tested. Because of the requirement that the threshold be reached before proceeding to this step, this pattern will be the first pattern after an identified occurrence of the target pattern which does not match the target pattern, and will always be the code for the compression count computed in the compression procedure. The purpose of the decompression procedure is to remove this first pattern from the data stream and replace it in the data stream with a fixed number of additional repetitions of the target pattern, the fixed number being chosen to be the sum of the first pattern and the threshold count if the pattern following the first pattern is less than the target pattern or if there is no following pattern, and to be a preselected number plus the threshold count less the first pattern if the following pattern is greater than the target pattern. If the preselected number is chosen, as is preferred, to be the maximum binary value of sequence length, then the first pattern will be less than the compression ceiling if the pattern following the first pattern is less than the target pattern or if there is no following pattern, and will be greater than the compression ceiling if the following pattern is greater than the target pattern. Testing the size of the first pattern is more efficient than testing the relationship between the target pattern and following pattern directly, so the invention is preferably implemented by testing the first pattern size, as shown in step 326. 
     If the target pattern is the lesser of the two values, then, as shown at step 328, a run count, R, is calculated as the predetermined number, most preferably the bit value of the sequence length, plus the difference between the threshold and the first following pattern. If the target pattern is the greater of the two values, then a run count, R, is calculated as the sum of the first following pattern and the threshold, as shown at step 330. In either case, at step 332, the target pattern is then written to the data storage device R times is written into the data storage device. It will be seen that the first following pattern is never written into the data storage device in this procedure. The processor next advances a sequence length in the data stream at step 334, and then returns to step 308. If the repetitions of the target pattern continued to the end of the data stream, then when the processor returns to test for the next data at step 312, it will find none and end the procedure. 
     Thus, there has been described herein a method of operating the data processing means for compactly storing data while maintaining its natural collating sequence, and for efficiently restoring retrieved data to an uncompacted form using a general compression technique. It will be understood that various changes in the details, arrangements, and steps which have been described and illustrated above in order to explain the nature of the present invention may be made by those skilled in the art without departing from the principle and scope of the present invention as expressed in the appended claims.