Annotation of coherent/b/bin/zip/algorith.doc, revision 1.1.1.1

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]

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.