How to resolve the algorithm LZW compression step by step in the Mathematica/Wolfram Language programming language
How to resolve the algorithm LZW compression step by step in the Mathematica/Wolfram Language programming language
Table of Contents
Problem Statement
The Lempel-Ziv-Welch (LZW) algorithm provides loss-less data compression. You can read a complete description of it in the Wikipedia article on the subject. It was patented, but it entered the public domain in 2004.
Let's start with the solution:
Step by Step solution about How to resolve the algorithm LZW compression step by step in the Mathematica/Wolfram Language programming language
This Wolfram code snippet defines two functions, compress
and decompress
, that implement the Lempel-Ziv-Welch (LZW) compression algorithm, which is a lossless data compression algorithm that is used in many popular file formats like GIF and TIFF.
The compress
function takes an uncompressed
string as input and returns a compressed string. The function begins by initializing a dictionary of size 256, which maps each ASCII character to itself. The algorithm iteratively scans the input string and constructs a prefix code for every substring that it encounters. The prefix code for a substring is the code for the longest prefix of the substring that is already in the dictionary. If the substring is not in the dictionary, a new entry is added to the dictionary, and the code for the new entry is used to represent the substring. The compressed string is constructed by concatenating the codes for the substrings in the input string.
The decompress
function takes a compressed
string as input and returns the decompressed string. The function begins by initializing a dictionary of size 256, which maps each ASCII character to itself. The algorithm iteratively decodes the compressed string by reading a code and looking up the corresponding string in the dictionary. The decoded string is constructed by concatenating the strings that are looked up in the dictionary.
The following example illustrates how to use the compress
and decompress
functions:
compress["TOBEORNOTTOBEORTOBEORNOT"]
decompress[%]
The output of the above code is TOBEORNOTTOBEORTOBEORNOT
.
Source code in the wolfram programming language
compress[uncompressed_] :=
Module[{dictsize, dictionary, w, result, wc},
dictsize = 256;
dictionary = # -> # & /@ FromCharacterCode /@ Range@dictsize;
w = "";
result = {};
Do[wc = w <> c;
If[MemberQ[dictionary[[All, 1]], wc],
w = wc,
AppendTo[result, w /. dictionary];
AppendTo[dictionary, wc -> dictsize];
dictsize++;
w = c],
{c, Characters[uncompressed]}];
AppendTo[result, w /. dictionary];
result];
decompress::bc = "Bad compressed `1`";
decompress[compressed_] :=
Module[{dictsize, dictionary, w, result, entry},
dictsize = 256;
dictionary = # -> # & /@ FromCharacterCode /@ Range@dictsize;
w = result = compressed[[1]];
Do[Which[MemberQ[dictionary[[All, 1]], k],
entry = k /. dictionary,
k == dictsize,
entry = w <> StringTake[w, 1],
True,
Message[decompress::bc, k]];
result = result <> entry;
AppendTo[dictionary, dictsize -> w <> StringTake[entry, 1]];
dictsize++;
w = entry,
{k, compressed[[2 ;;]]}];
result];
(*How to use:*)
compress["TOBEORNOTTOBEORTOBEORNOT"]
decompress[%]
You may also check:How to resolve the algorithm Number names step by step in the Liberty BASIC programming language
You may also check:How to resolve the algorithm Least common multiple step by step in the Euler programming language
You may also check:How to resolve the algorithm Display a linear combination step by step in the F# programming language
You may also check:How to resolve the algorithm Day of the week step by step in the ECL programming language
You may also check:How to resolve the algorithm Create a two-dimensional array at runtime step by step in the C programming language