|
|
1.1 root 1: Zip's deflation algorithm is a variation of LZ77 (Lempel-Ziv 1977, see
2: reference below). It finds duplicated strings in the input data. The
3: second occurrence of a string is replaced by a pointer to the previous
4: string, in the form of a pair (distance, length). Distances are
5: limited to 32K bytes, and lengths are limited to 258 bytes. When a
6: string does not occur anywhere in the previous 32K bytes, it is
7: emitted as a sequence of literal bytes. (In this description,
8: 'string' must be taken as an arbitrary sequence of bytes, and is not
9: restricted to printable characters.)
10:
11: Literals or match lengths are compressed with one Huffman tree, and
12: match distances are compressed with another tree. The trees are stored
13: in a compact form at the start of each block. The blocks can have any
14: size (except that the compressed data for one block must fit in
15: available memory). A block is terminated when zip determines that it
16: would be useful to start another block with fresh trees. (This is
17: somewhat similar to compress.)
18:
19: Duplicated strings are found using a hash table. All input strings of
20: length 3 are inserted in the hash table. A hash index is computed for
21: the next 3 bytes. If the hash chain for this index is not empty, all
22: strings in the chain are compared with the current input string, and
23: the longest match is selected.
24:
25: The hash chains are searched starting with the most recent strings, to
26: favor small distances and thus take advantage of the Huffman encoding.
27: The hash chains are singly linked. There are no deletions from the
28: hash chains, the algorithm simply discards matches that are too old.
29:
30: To avoid a worst-case situation, very long hash chains are arbitrarily
31: truncated at a certain length, determined by a runtime option (zip -1
32: to -9). So zip does not always find the longest possible match but
33: generally finds a match which is long enough.
34:
35: zip also defers the selection of matches with a lazy evaluation
36: mechanism. After a match of length N has been found, zip searches for a
37: longer match at the next input byte. If a longer match is found, the
38: previous match is truncated to a length of one (thus producing a single
39: literal byte) and the longer match is emitted afterwards. Otherwise,
40: the original match is kept, and the next match search is attempted only
41: N steps later.
42:
43: The lazy match evaluation is also subject to a runtime parameter. If
44: the current match is long enough, zip reduces the search for a longer
45: match, thus speeding up the whole process. If compression ratio is more
46: important than speed, zip attempts a complete second search even if
47: the first match is already long enough.
48:
49: Jean-loup Gailly
50: [email protected]
51:
52: References:
53:
54: [LZ77] Ziv J., Lempel A., "A Universal Algorithm for Sequential Data
55: Compression", IEEE Transactions on Information Theory", Vol. 23, No. 3,
56: pp. 337-343.
57:
58: APPNOTE.TXT documentation file in PKZIP 1.93a. It is available by
59: ftp in ux1.cso.uiuc.edu:/pc/exec-pc/pkz193a.exe [128.174.5.59]
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.