Guest User

LZW Algorithm (JS) by Félix Cloutier (zneak)

a guest
Sep 2nd, 2011
514
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var LZW = function(depth)
  2. {
  3.     var compressDict = {};
  4.     var decompressArray = [];
  5.    
  6.     for (var i = 0; i < (1 << depth); i++)
  7.     {
  8.         var value = String.fromCharCode(i);
  9.         compressDict[value] = i;
  10.         decompressArray.push(value);
  11.     }
  12.    
  13.     function copyCompressDict()
  14.     {
  15.         var dict = {};
  16.         for (var key in compressDict) dict[key] = compressDict[key];
  17.         return dict;
  18.     }
  19.    
  20.     function copyDecompressArray()
  21.     {
  22.         var arr = [];
  23.         for (var i = 0; i < decompressArray.length; i++)
  24.             arr.push(decompressArray[i]);
  25.         return arr;
  26.     }
  27.    
  28.     this.compress = function(str)
  29.     {
  30.         var dict = copyCompressDict();
  31.         var nextDictValue = 1 << depth;
  32.        
  33.         var key = '';
  34.         var output = [];
  35.         for (var i = 0; i < str.length; i++)
  36.         {
  37.             var currentChar = str[i];
  38.             if (dict[key + currentChar] !== undefined)
  39.             {
  40.                 key += currentChar;
  41.             }
  42.             else
  43.             {
  44.                 dict[key + currentChar] = nextDictValue;
  45.                 output.push(dict[key]);
  46.                 nextDictValue++;
  47.                 key = currentChar;
  48.             }
  49.         }
  50.        
  51.         output.push(dict[key]);
  52.         return output;
  53.     }
  54.    
  55.     this.decompress = function(compressed)
  56.     {
  57.         var dict = copyDecompressArray();
  58.        
  59.         var key = compressed[0];
  60.         var output = dict[key];
  61.         var w = output;
  62.         var entry = '';
  63.        
  64.         for (var i = 1; i < compressed.length; i++)
  65.         {
  66.             key = compressed[i];
  67.             if (key < dict.length)
  68.                 entry = dict[key];
  69.             else
  70.                 entry = w + w.charAt(0);
  71.            
  72.             output += entry;
  73.             dict.push(w + entry.charAt(0));
  74.             w = entry;
  75.         }
  76.        
  77.         return output;
  78.     }
  79. }
  80.  
  81. var lzw = new LZW(8);
  82. var input = "TOBEORNOTTOBEORTOBEORNOT#";
  83. var compressed = lzw.compress(input);
  84. console.log(input);
  85. console.log(compressed);
  86. console.log(lzw.decompress(compressed));
Advertisement
Add Comment
Please, Sign In to add comment