The LempelZivWelch (LZW) Algorithm Tom Magerlein May 10, 2017 - - PowerPoint PPT Presentation

the lempel ziv welch lzw algorithm
SMART_READER_LITE
LIVE PREVIEW

The LempelZivWelch (LZW) Algorithm Tom Magerlein May 10, 2017 - - PowerPoint PPT Presentation

The LempelZivWelch (LZW) Algorithm Tom Magerlein May 10, 2017 Asked during Bens presentation on Huffman coding: Can we replace common sequences of characters, like the, with single codes? Asked during Bens presentation on


slide-1
SLIDE 1

The Lempel–Ziv–Welch (LZW) Algorithm

Tom Magerlein May 10, 2017

slide-2
SLIDE 2

Asked during Ben’s presentation on Huffman coding:

Can we replace common sequences of characters, like “the”, with single codes?

slide-3
SLIDE 3

Asked during Ben’s presentation on Huffman coding:

Can we replace common sequences of characters, like “the”, with single codes?

Yes!

slide-4
SLIDE 4

Origins

◮ 1977-78: Lempel and Ziv introduce LZ77 and LZ78

◮ LZ77: Replace previously seen sequences of characters with

references to previous appearances

◮ LZ78: Instead of referencing earlier parts of file directly, builds

a dictionary of previously-seen symbol sequences

◮ 1983: Sperry Corp. (later Unisys) files patent on original LZW

implementation

◮ 1984: Welch publishes “A Technique for High-Performance

Data Compression”, describing the LZW algorithm

slide-5
SLIDE 5

Origins

slide-6
SLIDE 6

Uses and Patent Troubles

◮ Saw use in some compression utilities, but most notable use

was in CompuServe’s GIF image format, introduced in 1987

◮ In 1993/4, Unisys discovers use of LZW in GIF format,

attempts to claim licensing fees from software that handles GIF images

◮ Leads to development of the patent-unencumbered PNG

format and the widespread use of the DEFLATE compression algorithm, as well as use of the GIF format without compression

◮ Patent expired in 2003, but still not widely used except in GIF

slide-7
SLIDE 7

LZ77: Overview

◮ Replaces previously seen data segments with a reference to

where they last occurred, as a pair indicating offset and sequence length

◮ Compressor keeps an output history (typically a few kilobytes),

called the “sliding window”, and a lookahead buffer

◮ Algorithm

◮ Find longest prefix of data in lookahead buffer which occurs in

sliding window

◮ If such a prefix exists, and it would save space to do so, output

reference to its last occurrence; otherwise output first unit of data as a literal

slide-8
SLIDE 8

LZ77: A Short Example

A B C B A B C B C B C

slide-9
SLIDE 9

LZ77: A Short Example

A B C B A B C B C B C A B C B

slide-10
SLIDE 10

LZ77: A Short Example

A B C B A B C B C B C A B C B A B C length 3

slide-11
SLIDE 11

LZ77: A Short Example

A B C B A B C B C B C A B C B A B C B C B C length 3 length 4

slide-12
SLIDE 12

LZ78: Overview

◮ Replaces LZ77 sliding window with a dictionary, and

backreferences with codes representing entries in the dictionary

◮ Compressor, decompressor agree on rules to build dictionary,

so it does not need to be stored with compressed data

◮ Algorithm:

◮ Find longest prefix of lookahead buffer in current dictionary ◮ Output code for that prefix ◮ Output code for first character after prefix ◮ Add prefix followed by next character to dictionary, if

dictionary is not full

slide-13
SLIDE 13

LZ78: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-14
SLIDE 14

LZ78: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-15
SLIDE 15

LZ78: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-16
SLIDE 16

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100

slide-17
SLIDE 17

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100

slide-18
SLIDE 18

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100

slide-19
SLIDE 19

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101

slide-20
SLIDE 20

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101

slide-21
SLIDE 21

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101

slide-22
SLIDE 22

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101

slide-23
SLIDE 23

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110

slide-24
SLIDE 24

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110

slide-25
SLIDE 25

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110

slide-26
SLIDE 26

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110

slide-27
SLIDE 27

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-28
SLIDE 28

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-29
SLIDE 29

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-30
SLIDE 30

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-31
SLIDE 31

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-32
SLIDE 32

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] Dictionary A 0000 ABCB 1000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-33
SLIDE 33

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] Dictionary A 0000 ABCB 1000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-34
SLIDE 34

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] Dictionary A 0000 ABCB 1000 B 0001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-35
SLIDE 35

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-36
SLIDE 36

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-37
SLIDE 37

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-38
SLIDE 38

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-39
SLIDE 39

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] [BB] [B] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 BBB 1010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-40
SLIDE 40

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] [BB] [B] [EOF] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 BBB 1010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-41
SLIDE 41

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] [BB] [B] [EOF] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 BBB 1010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-42
SLIDE 42

LZW: Overview

◮ Extends LZ78 to eliminate the requirement that the symbol at

the end of a new dictionary entry be emitted as a literal, instead using it as first symbol of next prefix

◮ Now possible for decompressor to encounter codes before they

are added to its dictionary:

slide-43
SLIDE 43

LZW: Overview

◮ Extends LZ78 to eliminate the requirement that the symbol at

the end of a new dictionary entry be emitted as a literal, instead using it as first symbol of next prefix

◮ Now possible for decompressor to encounter codes before they

are added to its dictionary: AAA → [A][AA]

◮ Unknown code must have been added to dictionary after

encoding previously received sequence; must therefore code for the previously received sequence followed by one more character

slide-44
SLIDE 44

LZW: Overview

◮ Extends LZ78 to eliminate the requirement that the symbol at

the end of a new dictionary entry be emitted as a literal, instead using it as first symbol of next prefix

◮ Now possible for decompressor to encounter codes before they

are added to its dictionary: AAA → [A][AA]

◮ Unknown code must have been added to dictionary after

encoding previously received sequence; must therefore code for the previously received sequence followed by one more character

◮ Last character of sequence must be same as first, since the

new dictionary entry was last sequence followed by the last sequence again, followed by that character

slide-45
SLIDE 45

LZW: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-46
SLIDE 46

LZW: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-47
SLIDE 47

LZW: Example

A B C B C B A A B C A B C B B B B B B Dictionary A 0000 B 0001 C 0010 EOF 0011

slide-48
SLIDE 48

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100

slide-49
SLIDE 49

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100

slide-50
SLIDE 50

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101

slide-51
SLIDE 51

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101

slide-52
SLIDE 52

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110

slide-53
SLIDE 53

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110

slide-54
SLIDE 54

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110

slide-55
SLIDE 55

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-56
SLIDE 56

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] Dictionary A 0000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-57
SLIDE 57

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] Dictionary A 0000 BA 1000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-58
SLIDE 58

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] Dictionary A 0000 BA 1000 B 0001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-59
SLIDE 59

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-60
SLIDE 60

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-61
SLIDE 61

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-62
SLIDE 62

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-63
SLIDE 63

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-64
SLIDE 64

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-65
SLIDE 65

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-66
SLIDE 66

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-67
SLIDE 67

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 BC 0101 CB 0110 BCB 0111

slide-68
SLIDE 68

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 CB 0110 BCB 0111

slide-69
SLIDE 69

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 CB 0110 BCB 0111

slide-70
SLIDE 70

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 CB 0110 BCB 0111

slide-71
SLIDE 71

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BCB 0111

slide-72
SLIDE 72

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BCB 0111

slide-73
SLIDE 73

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] [BB] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BBB 1110 BCB 0111

slide-74
SLIDE 74

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] [BB] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BBB 1110 BCB 0111

slide-75
SLIDE 75

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] [BB] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BBB 1110 BCB 0111

slide-76
SLIDE 76

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] [BB] [BBB] [EOF] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BBB 1110 BCB 0111

slide-77
SLIDE 77

LZW: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [BC] [B] [A] [AB] [C] [ABC] [B] [BB] [BBB] [EOF] Dictionary A 0000 BA 1000 B 0001 AA 1001 C 0010 ABC 1010 EOF 0011 CA 1011 AB 0100 ABCB 1100 BC 0101 BB 1101 CB 0110 BBB 1110 BCB 0111

slide-78
SLIDE 78

LZ78: Example

A B C B C B A A B C A B C B B B B B B [A] [B] [C] [B] [CB] [A] [AB] [C] [ABC] [B] [B] [B] [BB] [B] [EOF] Dictionary A 0000 ABCB 1000 B 0001 BB 1001 C 0010 BBB 1010 EOF 0011 AB 0100 CB 0101 CBA 0110 ABC 0111

slide-79
SLIDE 79

LZW: Simple Variants

◮ Implementation that Welch proposed in his paper took 8-bit

symbols to 12-bit codes, which remains common

◮ Welch also briefly mentions variable code length, where

symbol width starts at the minimum necessary to represent all codes in the dictionary, and increases as the dictionary grows

◮ Some variants have a “clear” code, which encoder can emit to

make decoder reset its dictionary, in case data being compressed changes such that previously built dictionary no longer matches input well

◮ Others will replace rarely-used codes with new ones when the

dictionary fills up

slide-80
SLIDE 80

Analysis

Compression Ratios for English Text, Various Code Widths

slide-81
SLIDE 81

Analysis

Dictionary Entry Length, Various Code Widths

5 10 15 20 25 10000 20000 30000 40000 50000

text.10.stats

5 10 15 20 25 10000 20000 30000 40000 50000

text.12.stats

5 10 15 20 25 10000 20000 30000 40000 50000

text.14.stats

5 10 15 20 25 10000 20000 30000 40000 50000

text.16.stats

5 10 15 20 25 10000 20000 30000 40000 50000

text.18.stats

5 10 15 20 25 10000 20000 30000 40000 50000

text.20.stats

slide-82
SLIDE 82

Analysis

Dictionary Entry Length, Various Code Widths

5 10 15 20 25 50 100 150 200 250

text.10.stats

5 10 15 20 25 50 100 150 200 250

text.12.stats

5 10 15 20 25 50 100 150 200 250

text.14.stats

5 10 15 20 25 50 100 150 200 250

text.16.stats

5 10 15 20 25 50 100 150 200 250

text.18.stats

5 10 15 20 25 50 100 150 200 250

text.20.stats

slide-83
SLIDE 83

References

◮ Welch, T. “A Technique for High-Performance Data Compression”. Computer 17 (6): 8–19 (1984). ◮ Welch, T., inventor; High speed data compression and decompression apparatus and method. US Patent 4,558,302. December 10, 1985. ◮ “History of GIFLIB”. http://giflib.sourceforge.net/history.html ◮ “Lempel-Ziv-Welch (LZW) Compression”. http://netghost.narod.ru/gff/graphics/book/ch09_04.htm ◮ “History of Lossless Data Compression Algorithms”. http://ethw.org/History_of_Lossless_Data_Compression_Algorithms