Lempel-Ziv-Welch (LZW) Compression Algorithm
Lempel-Ziv-Welch (LZW) Compression Algorithm
• LZW Limitations
LZW Encoding Algorithm
• If the message to be encoded consists of only one character, LZW outputs the
code for this character; otherwise it inserts two- or multi-character,
overlapping*,
distinct patterns of the message to be encoded in a Dictionary.
*The last character of a pattern is the first character of the next pattern.
• The patterns are of the form: C0C1 . . . Cn-1Cn. The prefix of a pattern consists of
all the pattern characters except the last: C0C1 . . . Cn-1
1. BA is not in the Dictionary; insert BA, output the code for its prefix: code(B)
2. AB is not in the Dictionary; insert AB, output the code for its prefix: code(A)
3. BA is in the Dictionary.
BAA is not in Dictionary; insert BAA, output the code for its prefix: code(BA)
4. AB is in the Dictionary.
ABA is not in the Dictionary; insert ABA, output the code for its prefix: code(AB)
5. AA is not in the Dictionary; insert AA, output the code for its prefix: code(A)
6. AA is in the Dictionary and it is the last pattern; output its code: code(AA)
1. BA is not in the Dictionary; insert BA, output the code for its prefix: code(B)
2. AB is not in the Dictionary; insert AB, output the code for its prefix: code(A)
3. BA is in the Dictionary.
BAA is not in Dictionary; insert BAA, output the code for its prefix: code(BA)
4. AB is in the Dictionary.
ABR is not in the Dictionary; insert ABR, output the code for its prefix: code(AB)
5. RR is not in the Dictionary; insert RR, output the code for its prefix: code(R)
6. RR is in the Dictionary.
RRA is not in the Dictionary and it is the last pattern; insert RRA, output code for its prefix:
code(RR), then output code for last character: code(A)
Initialize Dictionary with 256 ASCII codes and corresponding single character strings as their
translations;
PreviousCodeWord first input code;
Output: string(PreviousCodeWord) ;
Char character(first input code);
CodeWord 256;
while(not end of code stream){
CurrentCodeWord next input code ;
if(CurrentCodeWord exists in the Dictionary)
String string(CurrentCodeWord) ;
else
String string(PreviousCodeWord) + Char ;
Output: String;
Char first character of String ;
insertInDictionary( (CodeWord , string(PreviousCodeWord) + Char ) );
PreviousCodeWord CurrentCodeWord ;
CodeWord++ ;
}
LZW Decoding Algorithm (cont’d)
Summary of LZW decoding algorithm:
• One approach is to clear entries 256-4095 and start building the dictionary
again.
• Write a Java program that decodes a given set of encoded codewords using
LZW.