Advertisement
Guest User

Untitled

a guest
Dec 28th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.54 KB | None | 0 0
  1. var alg = require("algorithms"),
  2. sort = alg.mergeSort;
  3.  
  4. /*
  5. * Huffman coding.
  6. *
  7. * @api public
  8. */
  9.  
  10. var huffman = function(alphabet){
  11. if(!(this instanceof huffman))
  12. return new huffman(alphabet);
  13.  
  14. var syms = [],
  15. symtbl = {};
  16.  
  17. for(var sym in alphabet){
  18. symtbl[sym] = null;
  19. syms.push({ obj: [sym], key: alphabet[sym] });
  20. }
  21.  
  22. var cmp = function(a, b){ return a.key >= b.key },
  23. h = sort(syms, cmp);
  24.  
  25. while(h.length !== 2){
  26. var fmin = h.pop(),
  27. smin = h.pop();
  28.  
  29. var meta = smin.obj.concat(fmin.obj),
  30. key = fmin.key + smin.key;
  31.  
  32. h.push({ obj: meta, key: key });
  33. h = sort(h, cmp);
  34. }
  35.  
  36. var rsyms = h[0]["obj"],
  37. lsyms = h[1]["obj"],
  38. isone = false,
  39. split = function(array, base){
  40. if(array.length === 1){
  41. if(isone) symtbl[array[0]] = base + "0";
  42. else symtbl[array[0]] = base + "1";
  43. }else if(array.length === 2){
  44. var sym = array.shift();
  45. symtbl[sym] = base + "0";
  46. var sym = array.shift();
  47. symtbl[sym] = base + "1";
  48. }else{
  49. var sym = array.shift();
  50. symtbl[sym] = base + "0";
  51. split(array, base + "1");
  52. }
  53.  
  54. isone = !isone;
  55. return;
  56. };
  57.  
  58. if(lsyms.length === 1){
  59. symtbl[lsyms[0]] = "0";
  60. split(rsyms, "1");
  61. }else{
  62. split(lsyms, "0");
  63. split(rsyms, "1");
  64. }
  65.  
  66. var luptbl = {};
  67.  
  68. for(var i in symtbl){
  69. luptbl[symtbl[i]] = i;
  70. }
  71.  
  72. this.symtbl = symtbl;
  73. this.luptbl = luptbl;
  74. }
  75.  
  76. /*
  77. * Encode a string.
  78. *
  79. * @api public
  80. */
  81.  
  82. huffman.prototype.encode = function(str){
  83. if(Buffer.isBuffer(str))
  84. str = str.toString();
  85.  
  86. var enc = [];
  87.  
  88. for(var i = 0; i < str.length; i++){
  89. var code = this.symtbl[str[i]];
  90. if(code !== undefined){
  91. enc = enc.concat(code);
  92. }
  93. }
  94.  
  95. return new Buffer(enc);
  96. }
  97.  
  98. /*
  99. * Decode a buffer.
  100. *
  101. * @returns {String} decoded string
  102. *
  103. * @api public
  104. */
  105.  
  106. huffman.prototype.decode = function(buf){
  107. if(!Buffer.isBuffer(buf))
  108. buf = new Buffer(buf);
  109.  
  110. var holder = "",
  111. out = ""
  112. luptbl = this.luptbl;
  113.  
  114. for(var i = 0; i < buf.length; i++){
  115. var letter = buf[i];
  116. holder += letter;
  117.  
  118. var decode = luptbl[holder];
  119.  
  120. if(decode){
  121. out += decode;
  122. holder = "";
  123. }
  124. }
  125.  
  126. return out;
  127. }
  128.  
  129. // Exports
  130. module.exports = huffman;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement