1*4a5d661aSToomas Soome1. Compression algorithm (deflate) 2*4a5d661aSToomas Soome 3*4a5d661aSToomas SoomeThe deflation algorithm used by gzip (also zip and zlib) is a variation of 4*4a5d661aSToomas SoomeLZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in 5*4a5d661aSToomas Soomethe input data. The second occurrence of a string is replaced by a 6*4a5d661aSToomas Soomepointer to the previous string, in the form of a pair (distance, 7*4a5d661aSToomas Soomelength). Distances are limited to 32K bytes, and lengths are limited 8*4a5d661aSToomas Soometo 258 bytes. When a string does not occur anywhere in the previous 9*4a5d661aSToomas Soome32K bytes, it is emitted as a sequence of literal bytes. (In this 10*4a5d661aSToomas Soomedescription, `string' must be taken as an arbitrary sequence of bytes, 11*4a5d661aSToomas Soomeand is not restricted to printable characters.) 12*4a5d661aSToomas Soome 13*4a5d661aSToomas SoomeLiterals or match lengths are compressed with one Huffman tree, and 14*4a5d661aSToomas Soomematch distances are compressed with another tree. The trees are stored 15*4a5d661aSToomas Soomein a compact form at the start of each block. The blocks can have any 16*4a5d661aSToomas Soomesize (except that the compressed data for one block must fit in 17*4a5d661aSToomas Soomeavailable memory). A block is terminated when deflate() determines that 18*4a5d661aSToomas Soomeit would be useful to start another block with fresh trees. (This is 19*4a5d661aSToomas Soomesomewhat similar to the behavior of LZW-based _compress_.) 20*4a5d661aSToomas Soome 21*4a5d661aSToomas SoomeDuplicated strings are found using a hash table. All input strings of 22*4a5d661aSToomas Soomelength 3 are inserted in the hash table. A hash index is computed for 23*4a5d661aSToomas Soomethe next 3 bytes. If the hash chain for this index is not empty, all 24*4a5d661aSToomas Soomestrings in the chain are compared with the current input string, and 25*4a5d661aSToomas Soomethe longest match is selected. 26*4a5d661aSToomas Soome 27*4a5d661aSToomas SoomeThe hash chains are searched starting with the most recent strings, to 28*4a5d661aSToomas Soomefavor small distances and thus take advantage of the Huffman encoding. 29*4a5d661aSToomas SoomeThe hash chains are singly linked. There are no deletions from the 30*4a5d661aSToomas Soomehash chains, the algorithm simply discards matches that are too old. 31*4a5d661aSToomas Soome 32*4a5d661aSToomas SoomeTo avoid a worst-case situation, very long hash chains are arbitrarily 33*4a5d661aSToomas Soometruncated at a certain length, determined by a runtime option (level 34*4a5d661aSToomas Soomeparameter of deflateInit). So deflate() does not always find the longest 35*4a5d661aSToomas Soomepossible match but generally finds a match which is long enough. 36*4a5d661aSToomas Soome 37*4a5d661aSToomas Soomedeflate() also defers the selection of matches with a lazy evaluation 38*4a5d661aSToomas Soomemechanism. After a match of length N has been found, deflate() searches for 39*4a5d661aSToomas Soomea longer match at the next input byte. If a longer match is found, the 40*4a5d661aSToomas Soomeprevious match is truncated to a length of one (thus producing a single 41*4a5d661aSToomas Soomeliteral byte) and the process of lazy evaluation begins again. Otherwise, 42*4a5d661aSToomas Soomethe original match is kept, and the next match search is attempted only N 43*4a5d661aSToomas Soomesteps later. 44*4a5d661aSToomas Soome 45*4a5d661aSToomas SoomeThe lazy match evaluation is also subject to a runtime parameter. If 46*4a5d661aSToomas Soomethe current match is long enough, deflate() reduces the search for a longer 47*4a5d661aSToomas Soomematch, thus speeding up the whole process. If compression ratio is more 48*4a5d661aSToomas Soomeimportant than speed, deflate() attempts a complete second search even if 49*4a5d661aSToomas Soomethe first match is already long enough. 50*4a5d661aSToomas Soome 51*4a5d661aSToomas SoomeThe lazy match evaluation is not performed for the fastest compression 52*4a5d661aSToomas Soomemodes (level parameter 1 to 3). For these fast modes, new strings 53*4a5d661aSToomas Soomeare inserted in the hash table only when no match was found, or 54*4a5d661aSToomas Soomewhen the match is not too long. This degrades the compression ratio 55*4a5d661aSToomas Soomebut saves time since there are both fewer insertions and fewer searches. 56*4a5d661aSToomas Soome 57*4a5d661aSToomas Soome 58*4a5d661aSToomas Soome2. Decompression algorithm (inflate) 59*4a5d661aSToomas Soome 60*4a5d661aSToomas Soome2.1 Introduction 61*4a5d661aSToomas Soome 62*4a5d661aSToomas SoomeThe key question is how to represent a Huffman code (or any prefix code) so 63*4a5d661aSToomas Soomethat you can decode fast. The most important characteristic is that shorter 64*4a5d661aSToomas Soomecodes are much more common than longer codes, so pay attention to decoding the 65*4a5d661aSToomas Soomeshort codes fast, and let the long codes take longer to decode. 66*4a5d661aSToomas Soome 67*4a5d661aSToomas Soomeinflate() sets up a first level table that covers some number of bits of 68*4a5d661aSToomas Soomeinput less than the length of longest code. It gets that many bits from the 69*4a5d661aSToomas Soomestream, and looks it up in the table. The table will tell if the next 70*4a5d661aSToomas Soomecode is that many bits or less and how many, and if it is, it will tell 71*4a5d661aSToomas Soomethe value, else it will point to the next level table for which inflate() 72*4a5d661aSToomas Soomegrabs more bits and tries to decode a longer code. 73*4a5d661aSToomas Soome 74*4a5d661aSToomas SoomeHow many bits to make the first lookup is a tradeoff between the time it 75*4a5d661aSToomas Soometakes to decode and the time it takes to build the table. If building the 76*4a5d661aSToomas Soometable took no time (and if you had infinite memory), then there would only 77*4a5d661aSToomas Soomebe a first level table to cover all the way to the longest code. However, 78*4a5d661aSToomas Soomebuilding the table ends up taking a lot longer for more bits since short 79*4a5d661aSToomas Soomecodes are replicated many times in such a table. What inflate() does is 80*4a5d661aSToomas Soomesimply to make the number of bits in the first table a variable, and then 81*4a5d661aSToomas Soometo set that variable for the maximum speed. 82*4a5d661aSToomas Soome 83*4a5d661aSToomas SoomeFor inflate, which has 286 possible codes for the literal/length tree, the size 84*4a5d661aSToomas Soomeof the first table is nine bits. Also the distance trees have 30 possible 85*4a5d661aSToomas Soomevalues, and the size of the first table is six bits. Note that for each of 86*4a5d661aSToomas Soomethose cases, the table ended up one bit longer than the ``average'' code 87*4a5d661aSToomas Soomelength, i.e. the code length of an approximately flat code which would be a 88*4a5d661aSToomas Soomelittle more than eight bits for 286 symbols and a little less than five bits 89*4a5d661aSToomas Soomefor 30 symbols. 90*4a5d661aSToomas Soome 91*4a5d661aSToomas Soome 92*4a5d661aSToomas Soome2.2 More details on the inflate table lookup 93*4a5d661aSToomas Soome 94*4a5d661aSToomas SoomeOk, you want to know what this cleverly obfuscated inflate tree actually 95*4a5d661aSToomas Soomelooks like. You are correct that it's not a Huffman tree. It is simply a 96*4a5d661aSToomas Soomelookup table for the first, let's say, nine bits of a Huffman symbol. The 97*4a5d661aSToomas Soomesymbol could be as short as one bit or as long as 15 bits. If a particular 98*4a5d661aSToomas Soomesymbol is shorter than nine bits, then that symbol's translation is duplicated 99*4a5d661aSToomas Soomein all those entries that start with that symbol's bits. For example, if the 100*4a5d661aSToomas Soomesymbol is four bits, then it's duplicated 32 times in a nine-bit table. If a 101*4a5d661aSToomas Soomesymbol is nine bits long, it appears in the table once. 102*4a5d661aSToomas Soome 103*4a5d661aSToomas SoomeIf the symbol is longer than nine bits, then that entry in the table points 104*4a5d661aSToomas Soometo another similar table for the remaining bits. Again, there are duplicated 105*4a5d661aSToomas Soomeentries as needed. The idea is that most of the time the symbol will be short 106*4a5d661aSToomas Soomeand there will only be one table look up. (That's whole idea behind data 107*4a5d661aSToomas Soomecompression in the first place.) For the less frequent long symbols, there 108*4a5d661aSToomas Soomewill be two lookups. If you had a compression method with really long 109*4a5d661aSToomas Soomesymbols, you could have as many levels of lookups as is efficient. For 110*4a5d661aSToomas Soomeinflate, two is enough. 111*4a5d661aSToomas Soome 112*4a5d661aSToomas SoomeSo a table entry either points to another table (in which case nine bits in 113*4a5d661aSToomas Soomethe above example are gobbled), or it contains the translation for the symbol 114*4a5d661aSToomas Soomeand the number of bits to gobble. Then you start again with the next 115*4a5d661aSToomas Soomeungobbled bit. 116*4a5d661aSToomas Soome 117*4a5d661aSToomas SoomeYou may wonder: why not just have one lookup table for how ever many bits the 118*4a5d661aSToomas Soomelongest symbol is? The reason is that if you do that, you end up spending 119*4a5d661aSToomas Soomemore time filling in duplicate symbol entries than you do actually decoding. 120*4a5d661aSToomas SoomeAt least for deflate's output that generates new trees every several 10's of 121*4a5d661aSToomas Soomekbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code 122*4a5d661aSToomas Soomewould take too long if you're only decoding several thousand symbols. At the 123*4a5d661aSToomas Soomeother extreme, you could make a new table for every bit in the code. In fact, 124*4a5d661aSToomas Soomethat's essentially a Huffman tree. But then you spend too much time 125*4a5d661aSToomas Soometraversing the tree while decoding, even for short symbols. 126*4a5d661aSToomas Soome 127*4a5d661aSToomas SoomeSo the number of bits for the first lookup table is a trade of the time to 128*4a5d661aSToomas Soomefill out the table vs. the time spent looking at the second level and above of 129*4a5d661aSToomas Soomethe table. 130*4a5d661aSToomas Soome 131*4a5d661aSToomas SoomeHere is an example, scaled down: 132*4a5d661aSToomas Soome 133*4a5d661aSToomas SoomeThe code being decoded, with 10 symbols, from 1 to 6 bits long: 134*4a5d661aSToomas Soome 135*4a5d661aSToomas SoomeA: 0 136*4a5d661aSToomas SoomeB: 10 137*4a5d661aSToomas SoomeC: 1100 138*4a5d661aSToomas SoomeD: 11010 139*4a5d661aSToomas SoomeE: 11011 140*4a5d661aSToomas SoomeF: 11100 141*4a5d661aSToomas SoomeG: 11101 142*4a5d661aSToomas SoomeH: 11110 143*4a5d661aSToomas SoomeI: 111110 144*4a5d661aSToomas SoomeJ: 111111 145*4a5d661aSToomas Soome 146*4a5d661aSToomas SoomeLet's make the first table three bits long (eight entries): 147*4a5d661aSToomas Soome 148*4a5d661aSToomas Soome000: A,1 149*4a5d661aSToomas Soome001: A,1 150*4a5d661aSToomas Soome010: A,1 151*4a5d661aSToomas Soome011: A,1 152*4a5d661aSToomas Soome100: B,2 153*4a5d661aSToomas Soome101: B,2 154*4a5d661aSToomas Soome110: -> table X (gobble 3 bits) 155*4a5d661aSToomas Soome111: -> table Y (gobble 3 bits) 156*4a5d661aSToomas Soome 157*4a5d661aSToomas SoomeEach entry is what the bits decode as and how many bits that is, i.e. how 158*4a5d661aSToomas Soomemany bits to gobble. Or the entry points to another table, with the number of 159*4a5d661aSToomas Soomebits to gobble implicit in the size of the table. 160*4a5d661aSToomas Soome 161*4a5d661aSToomas SoomeTable X is two bits long since the longest code starting with 110 is five bits 162*4a5d661aSToomas Soomelong: 163*4a5d661aSToomas Soome 164*4a5d661aSToomas Soome00: C,1 165*4a5d661aSToomas Soome01: C,1 166*4a5d661aSToomas Soome10: D,2 167*4a5d661aSToomas Soome11: E,2 168*4a5d661aSToomas Soome 169*4a5d661aSToomas SoomeTable Y is three bits long since the longest code starting with 111 is six 170*4a5d661aSToomas Soomebits long: 171*4a5d661aSToomas Soome 172*4a5d661aSToomas Soome000: F,2 173*4a5d661aSToomas Soome001: F,2 174*4a5d661aSToomas Soome010: G,2 175*4a5d661aSToomas Soome011: G,2 176*4a5d661aSToomas Soome100: H,2 177*4a5d661aSToomas Soome101: H,2 178*4a5d661aSToomas Soome110: I,3 179*4a5d661aSToomas Soome111: J,3 180*4a5d661aSToomas Soome 181*4a5d661aSToomas SoomeSo what we have here are three tables with a total of 20 entries that had to 182*4a5d661aSToomas Soomebe constructed. That's compared to 64 entries for a single table. Or 183*4a5d661aSToomas Soomecompared to 16 entries for a Huffman tree (six two entry tables and one four 184*4a5d661aSToomas Soomeentry table). Assuming that the code ideally represents the probability of 185*4a5d661aSToomas Soomethe symbols, it takes on the average 1.25 lookups per symbol. That's compared 186*4a5d661aSToomas Soometo one lookup for the single table, or 1.66 lookups per symbol for the 187*4a5d661aSToomas SoomeHuffman tree. 188*4a5d661aSToomas Soome 189*4a5d661aSToomas SoomeThere, I think that gives you a picture of what's going on. For inflate, the 190*4a5d661aSToomas Soomemeaning of a particular symbol is often more than just a letter. It can be a 191*4a5d661aSToomas Soomebyte (a "literal"), or it can be either a length or a distance which 192*4a5d661aSToomas Soomeindicates a base value and a number of bits to fetch after the code that is 193*4a5d661aSToomas Soomeadded to the base value. Or it might be the special end-of-block code. The 194*4a5d661aSToomas Soomedata structures created in inftrees.c try to encode all that information 195*4a5d661aSToomas Soomecompactly in the tables. 196*4a5d661aSToomas Soome 197*4a5d661aSToomas Soome 198*4a5d661aSToomas SoomeJean-loup Gailly Mark Adler 199*4a5d661aSToomas Soomejloup@gzip.org madler@alumni.caltech.edu 200*4a5d661aSToomas Soome 201*4a5d661aSToomas Soome 202*4a5d661aSToomas SoomeReferences: 203*4a5d661aSToomas Soome 204*4a5d661aSToomas Soome[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data 205*4a5d661aSToomas SoomeCompression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3, 206*4a5d661aSToomas Soomepp. 337-343. 207*4a5d661aSToomas Soome 208*4a5d661aSToomas Soome``DEFLATE Compressed Data Format Specification'' available in 209*4a5d661aSToomas Soomehttp://tools.ietf.org/html/rfc1951 210