annotate src/zlib-1.2.7/doc/algorithm.txt @ 4:e13257ea84a4

Add bzip2, zlib, liblo, portaudio sources
author Chris Cannam
date Wed, 20 Mar 2013 13:59:52 +0000
parents
children
rev   line source
Chris@4 1 1. Compression algorithm (deflate)
Chris@4 2
Chris@4 3 The deflation algorithm used by gzip (also zip and zlib) is a variation of
Chris@4 4 LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
Chris@4 5 the input data. The second occurrence of a string is replaced by a
Chris@4 6 pointer to the previous string, in the form of a pair (distance,
Chris@4 7 length). Distances are limited to 32K bytes, and lengths are limited
Chris@4 8 to 258 bytes. When a string does not occur anywhere in the previous
Chris@4 9 32K bytes, it is emitted as a sequence of literal bytes. (In this
Chris@4 10 description, `string' must be taken as an arbitrary sequence of bytes,
Chris@4 11 and is not restricted to printable characters.)
Chris@4 12
Chris@4 13 Literals or match lengths are compressed with one Huffman tree, and
Chris@4 14 match distances are compressed with another tree. The trees are stored
Chris@4 15 in a compact form at the start of each block. The blocks can have any
Chris@4 16 size (except that the compressed data for one block must fit in
Chris@4 17 available memory). A block is terminated when deflate() determines that
Chris@4 18 it would be useful to start another block with fresh trees. (This is
Chris@4 19 somewhat similar to the behavior of LZW-based _compress_.)
Chris@4 20
Chris@4 21 Duplicated strings are found using a hash table. All input strings of
Chris@4 22 length 3 are inserted in the hash table. A hash index is computed for
Chris@4 23 the next 3 bytes. If the hash chain for this index is not empty, all
Chris@4 24 strings in the chain are compared with the current input string, and
Chris@4 25 the longest match is selected.
Chris@4 26
Chris@4 27 The hash chains are searched starting with the most recent strings, to
Chris@4 28 favor small distances and thus take advantage of the Huffman encoding.
Chris@4 29 The hash chains are singly linked. There are no deletions from the
Chris@4 30 hash chains, the algorithm simply discards matches that are too old.
Chris@4 31
Chris@4 32 To avoid a worst-case situation, very long hash chains are arbitrarily
Chris@4 33 truncated at a certain length, determined by a runtime option (level
Chris@4 34 parameter of deflateInit). So deflate() does not always find the longest
Chris@4 35 possible match but generally finds a match which is long enough.
Chris@4 36
Chris@4 37 deflate() also defers the selection of matches with a lazy evaluation
Chris@4 38 mechanism. After a match of length N has been found, deflate() searches for
Chris@4 39 a longer match at the next input byte. If a longer match is found, the
Chris@4 40 previous match is truncated to a length of one (thus producing a single
Chris@4 41 literal byte) and the process of lazy evaluation begins again. Otherwise,
Chris@4 42 the original match is kept, and the next match search is attempted only N
Chris@4 43 steps later.
Chris@4 44
Chris@4 45 The lazy match evaluation is also subject to a runtime parameter. If
Chris@4 46 the current match is long enough, deflate() reduces the search for a longer
Chris@4 47 match, thus speeding up the whole process. If compression ratio is more
Chris@4 48 important than speed, deflate() attempts a complete second search even if
Chris@4 49 the first match is already long enough.
Chris@4 50
Chris@4 51 The lazy match evaluation is not performed for the fastest compression
Chris@4 52 modes (level parameter 1 to 3). For these fast modes, new strings
Chris@4 53 are inserted in the hash table only when no match was found, or
Chris@4 54 when the match is not too long. This degrades the compression ratio
Chris@4 55 but saves time since there are both fewer insertions and fewer searches.
Chris@4 56
Chris@4 57
Chris@4 58 2. Decompression algorithm (inflate)
Chris@4 59
Chris@4 60 2.1 Introduction
Chris@4 61
Chris@4 62 The key question is how to represent a Huffman code (or any prefix code) so
Chris@4 63 that you can decode fast. The most important characteristic is that shorter
Chris@4 64 codes are much more common than longer codes, so pay attention to decoding the
Chris@4 65 short codes fast, and let the long codes take longer to decode.
Chris@4 66
Chris@4 67 inflate() sets up a first level table that covers some number of bits of
Chris@4 68 input less than the length of longest code. It gets that many bits from the
Chris@4 69 stream, and looks it up in the table. The table will tell if the next
Chris@4 70 code is that many bits or less and how many, and if it is, it will tell
Chris@4 71 the value, else it will point to the next level table for which inflate()
Chris@4 72 grabs more bits and tries to decode a longer code.
Chris@4 73
Chris@4 74 How many bits to make the first lookup is a tradeoff between the time it
Chris@4 75 takes to decode and the time it takes to build the table. If building the
Chris@4 76 table took no time (and if you had infinite memory), then there would only
Chris@4 77 be a first level table to cover all the way to the longest code. However,
Chris@4 78 building the table ends up taking a lot longer for more bits since short
Chris@4 79 codes are replicated many times in such a table. What inflate() does is
Chris@4 80 simply to make the number of bits in the first table a variable, and then
Chris@4 81 to set that variable for the maximum speed.
Chris@4 82
Chris@4 83 For inflate, which has 286 possible codes for the literal/length tree, the size
Chris@4 84 of the first table is nine bits. Also the distance trees have 30 possible
Chris@4 85 values, and the size of the first table is six bits. Note that for each of
Chris@4 86 those cases, the table ended up one bit longer than the ``average'' code
Chris@4 87 length, i.e. the code length of an approximately flat code which would be a
Chris@4 88 little more than eight bits for 286 symbols and a little less than five bits
Chris@4 89 for 30 symbols.
Chris@4 90
Chris@4 91
Chris@4 92 2.2 More details on the inflate table lookup
Chris@4 93
Chris@4 94 Ok, you want to know what this cleverly obfuscated inflate tree actually
Chris@4 95 looks like. You are correct that it's not a Huffman tree. It is simply a
Chris@4 96 lookup table for the first, let's say, nine bits of a Huffman symbol. The
Chris@4 97 symbol could be as short as one bit or as long as 15 bits. If a particular
Chris@4 98 symbol is shorter than nine bits, then that symbol's translation is duplicated
Chris@4 99 in all those entries that start with that symbol's bits. For example, if the
Chris@4 100 symbol is four bits, then it's duplicated 32 times in a nine-bit table. If a
Chris@4 101 symbol is nine bits long, it appears in the table once.
Chris@4 102
Chris@4 103 If the symbol is longer than nine bits, then that entry in the table points
Chris@4 104 to another similar table for the remaining bits. Again, there are duplicated
Chris@4 105 entries as needed. The idea is that most of the time the symbol will be short
Chris@4 106 and there will only be one table look up. (That's whole idea behind data
Chris@4 107 compression in the first place.) For the less frequent long symbols, there
Chris@4 108 will be two lookups. If you had a compression method with really long
Chris@4 109 symbols, you could have as many levels of lookups as is efficient. For
Chris@4 110 inflate, two is enough.
Chris@4 111
Chris@4 112 So a table entry either points to another table (in which case nine bits in
Chris@4 113 the above example are gobbled), or it contains the translation for the symbol
Chris@4 114 and the number of bits to gobble. Then you start again with the next
Chris@4 115 ungobbled bit.
Chris@4 116
Chris@4 117 You may wonder: why not just have one lookup table for how ever many bits the
Chris@4 118 longest symbol is? The reason is that if you do that, you end up spending
Chris@4 119 more time filling in duplicate symbol entries than you do actually decoding.
Chris@4 120 At least for deflate's output that generates new trees every several 10's of
Chris@4 121 kbytes. You can imagine that filling in a 2^15 entry table for a 15-bit code
Chris@4 122 would take too long if you're only decoding several thousand symbols. At the
Chris@4 123 other extreme, you could make a new table for every bit in the code. In fact,
Chris@4 124 that's essentially a Huffman tree. But then you spend too much time
Chris@4 125 traversing the tree while decoding, even for short symbols.
Chris@4 126
Chris@4 127 So the number of bits for the first lookup table is a trade of the time to
Chris@4 128 fill out the table vs. the time spent looking at the second level and above of
Chris@4 129 the table.
Chris@4 130
Chris@4 131 Here is an example, scaled down:
Chris@4 132
Chris@4 133 The code being decoded, with 10 symbols, from 1 to 6 bits long:
Chris@4 134
Chris@4 135 A: 0
Chris@4 136 B: 10
Chris@4 137 C: 1100
Chris@4 138 D: 11010
Chris@4 139 E: 11011
Chris@4 140 F: 11100
Chris@4 141 G: 11101
Chris@4 142 H: 11110
Chris@4 143 I: 111110
Chris@4 144 J: 111111
Chris@4 145
Chris@4 146 Let's make the first table three bits long (eight entries):
Chris@4 147
Chris@4 148 000: A,1
Chris@4 149 001: A,1
Chris@4 150 010: A,1
Chris@4 151 011: A,1
Chris@4 152 100: B,2
Chris@4 153 101: B,2
Chris@4 154 110: -> table X (gobble 3 bits)
Chris@4 155 111: -> table Y (gobble 3 bits)
Chris@4 156
Chris@4 157 Each entry is what the bits decode as and how many bits that is, i.e. how
Chris@4 158 many bits to gobble. Or the entry points to another table, with the number of
Chris@4 159 bits to gobble implicit in the size of the table.
Chris@4 160
Chris@4 161 Table X is two bits long since the longest code starting with 110 is five bits
Chris@4 162 long:
Chris@4 163
Chris@4 164 00: C,1
Chris@4 165 01: C,1
Chris@4 166 10: D,2
Chris@4 167 11: E,2
Chris@4 168
Chris@4 169 Table Y is three bits long since the longest code starting with 111 is six
Chris@4 170 bits long:
Chris@4 171
Chris@4 172 000: F,2
Chris@4 173 001: F,2
Chris@4 174 010: G,2
Chris@4 175 011: G,2
Chris@4 176 100: H,2
Chris@4 177 101: H,2
Chris@4 178 110: I,3
Chris@4 179 111: J,3
Chris@4 180
Chris@4 181 So what we have here are three tables with a total of 20 entries that had to
Chris@4 182 be constructed. That's compared to 64 entries for a single table. Or
Chris@4 183 compared to 16 entries for a Huffman tree (six two entry tables and one four
Chris@4 184 entry table). Assuming that the code ideally represents the probability of
Chris@4 185 the symbols, it takes on the average 1.25 lookups per symbol. That's compared
Chris@4 186 to one lookup for the single table, or 1.66 lookups per symbol for the
Chris@4 187 Huffman tree.
Chris@4 188
Chris@4 189 There, I think that gives you a picture of what's going on. For inflate, the
Chris@4 190 meaning of a particular symbol is often more than just a letter. It can be a
Chris@4 191 byte (a "literal"), or it can be either a length or a distance which
Chris@4 192 indicates a base value and a number of bits to fetch after the code that is
Chris@4 193 added to the base value. Or it might be the special end-of-block code. The
Chris@4 194 data structures created in inftrees.c try to encode all that information
Chris@4 195 compactly in the tables.
Chris@4 196
Chris@4 197
Chris@4 198 Jean-loup Gailly Mark Adler
Chris@4 199 jloup@gzip.org madler@alumni.caltech.edu
Chris@4 200
Chris@4 201
Chris@4 202 References:
Chris@4 203
Chris@4 204 [LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
Chris@4 205 Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
Chris@4 206 pp. 337-343.
Chris@4 207
Chris@4 208 ``DEFLATE Compressed Data Format Specification'' available in
Chris@4 209 http://tools.ietf.org/html/rfc1951