当前位置:Gxlcms > JavaScript > JS实现的哈夫曼编码示例【原始版与修改版】

JS实现的哈夫曼编码示例【原始版与修改版】

时间:2021-07-01 10:21:17 帮助过:6人阅读

本文实例讲述了JS实现的哈夫曼编码。分享给大家供大家参考,具体如下:

原始版

  1. function cal(str) {
  2. if (typeof str !== 'string' || str.length < 1) {
  3. return;
  4. }
  5. var map = {};
  6. var i = 0;
  7. while(str[i]) {
  8. map[str[i]] ? map[str[i]]++ : (map[str[i]] = 1);
  9. i++;
  10. }
  11. return map;
  12. }
  13. function sort(map) {
  14. map = map || {};
  15. var result = [];
  16. for (key in map) {
  17. if(map.hasOwnProperty(key)) {
  18. var obj = {
  19. key: key,
  20. val: map[key]
  21. };
  22. result.push(new Node(null, null, obj));
  23. }
  24. }
  25. return result.sort(function(x,y){return x.data.val > y.data.val});
  26. }
  27. function Node(left, right, data) {
  28. this.left = left;
  29. this.right = right;
  30. this.data = data;
  31. }
  32. function makeTree(table) {
  33. var i = 0;
  34. var len = table.length;
  35. var node1;
  36. var node2;
  37. var parentNode;
  38. while(table.length > 1) {
  39. parentNode = new Node(table[i], table[i+1], {key: null, val: table[i]['data'].val + table[i+1]['data'].val});
  40. table.splice(i,2);
  41. table.unshift(parentNode);
  42. table.sort(function(x,y){return x.data.val > y.data.val});
  43. }
  44. return table;
  45. }
  46. function encode(str, ret) {
  47. if (typeof str !== 'string' || str.length < 1) {
  48. return;
  49. }
  50. var i = 0;
  51. var result = '';
  52. while(str[i]) {
  53. result += ret[str[i++]];
  54. }
  55. return result
  56. }
  57. function reverseRet(ret) {
  58. var result = {};
  59. for (key in ret) {
  60. if(ret.hasOwnProperty(key)) {
  61. result[ret[key]] = key;
  62. }
  63. }
  64. return result;
  65. }
  66. function decode(str, ret) {
  67. var i = 0;
  68. var result = '';
  69. var data = '';
  70. var map = reverseRet(ret);
  71. while(str) {
  72. result += str[i++];
  73. if (result in map) {
  74. data += map[result];
  75. str = str.replace(new RegExp("^"+result),'');
  76. result = '';
  77. i = 0;
  78. }
  79. }
  80. console.log(data)
  81. }
  82. function traversal(tree, code, ret) {
  83. if (tree.left !== null) {
  84. traversal(tree.left, code + '0', ret);
  85. } else {
  86. ret[tree.data.key] = code;
  87. }
  88. if (tree.right !== null) {
  89. traversal(tree.right,code + '1', ret);
  90. } else {
  91. ret[tree.data.key] = code;
  92. }
  93. }
  94. var ret = {};
  95. var str = 'ew qew qd ef 24 gf ewr getElementsByTagName';
  96. traversal(makeTree(sort(cal(str)))[0],'', ret)
  97. decode(encode(str, ret), ret)
  98. btoa(encode(str,ret))

修改版

  1. function Huffman(str) {
  2. // 需要编码的字符串
  3. this.str = str;
  4. // 键和频率映射表
  5. this.keyCountMap = null;
  6. // 编码和键的映射表
  7. this.codeKeyMap = {};
  8. // 键和编码的映射表
  9. this.keyCodeMap = {};
  10. // 哈夫曼树节点列表
  11. this.nodeList = null;
  12. // 哈夫曼树根节点
  13. this.root = null;
  14. // 哈夫曼编码后的01序列
  15. this.code = null;
  16. }
  17. Huffman.prototype.cal = function cal() {
  18. str = this.str;
  19. var map = {};
  20. var i = 0;
  21. while(str[i]) {
  22. map[str[i]] ? map[str[i]]++ : (map[str[i]] = 1);
  23. i++;
  24. }
  25. this.keyCountMap = map;
  26. }
  27. Huffman.prototype.sort = function sort() {
  28. map = this.keyCountMap;
  29. var result = [];
  30. for (key in map) {
  31. if(map.hasOwnProperty(key)) {
  32. var obj = {
  33. key: key,
  34. val: map[key]
  35. };
  36. result.push(new Node(null, null, obj));
  37. }
  38. }
  39. this.nodeList = result.sort(function(x,y){return x.data.val > y.data.val});
  40. }
  41. function Node(left, right, data) {
  42. this.left = left;
  43. this.right = right;
  44. this.data = data;
  45. }
  46. Huffman.prototype.makeTree = function makeTree() {
  47. var i = 0;
  48. var len = this.nodeList.length;
  49. var node1;
  50. var node2;
  51. var parentNode;
  52. var table = this.nodeList;
  53. while(table.length > 1) {
  54. parentNode = new Node(table[i], table[i+1], {key: null, val: table[i]['data'].val + table[i+1]['data'].val});
  55. table.splice(i,2);
  56. table.unshift(parentNode);
  57. table.sort(function(x,y){return x.data.val > y.data.val});
  58. }
  59. this.root = table[0] || new Node();
  60. return this.root;
  61. }
  62. Huffman.prototype.traversal = function traversal(tree, code) {
  63. if (tree.left !== null) {
  64. traversal.call(this,tree.left, code + '0');
  65. } else {
  66. this.keyCodeMap[tree.data.key] = code;
  67. }
  68. if (tree.right !== null) {
  69. traversal.call(this, tree.right,code + '1');
  70. } else {
  71. this.keyCodeMap[tree.data.key] = code;
  72. }
  73. }
  74. Huffman.prototype.encode = function encode() {
  75. this.cal();
  76. this.sort();
  77. var root = this.makeTree();
  78. this.traversal(root, '');
  79. var ret = this.keyCodeMap;
  80. var i = 0;
  81. var result = '';
  82. var str = this.str;
  83. while(str[i]) {
  84. result += ret[str[i++]];
  85. }
  86. this.code = result;
  87. console.log('encode:' + result);
  88. return result
  89. }
  90. Huffman.prototype.reverseMap = function reverseMap() {
  91. var ret = this.keyCodeMap;
  92. var result = {};
  93. for (key in ret) {
  94. if(ret.hasOwnProperty(key)) {
  95. result[ret[key]] = key;
  96. }
  97. }
  98. this.codeKeyMap = result;
  99. return result;
  100. }
  101. Huffman.prototype.decode = function decode() {
  102. var i = 0;
  103. var result = '';
  104. var data = '';
  105. var map = this.reverseMap();
  106. var str = this.code;
  107. while(str) {
  108. result += str[i++];
  109. if (result in map) {
  110. data += map[result];
  111. str = str.replace(new RegExp("^"+result),'');
  112. result = '';
  113. i = 0;
  114. }
  115. }
  116. console.log("decode:" + data)
  117. }
  118. Huffman.prototype.encodeBase64 = function() {
  119. try {
  120. var base64 = btoa(this.code);
  121. return base64;
  122. } catch(e) {
  123. return '';
  124. }
  125. }
  126. var str = 'ew qew qd ef 24 gf ewr getElementsByTagName';
  127. var huffman = new Huffman(str)
  128. huffman.encode(str)
  129. huffman.decode();
  130. huffman.encodeBase64();

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数据结构与算法技巧总结》、《JavaScript数学运算用法总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结》

希望本文所述对大家JavaScript程序设计有所帮助。

人气教程排行