源生js实现哈夫曼编码步骤详解

这次给大家带来源生js实现哈夫曼编码步骤详解,源生js实现哈夫曼编码的注意事项有哪些,下面就是实战案例,一起来看一下。

原始版

function cal(str) {  if (typeof str !== 'string' || str.length  y.data.val});}function Node(left, right, data) {  this.left = left;  this.right = right;  this.data = data;}function makeTree(table) {  var i = 0;  var len = table.length;  var node1;  var node2;  var parentNode;  while(table.length > 1) {    parentNode = new Node(table[i], table[i+1], {key: null, val: table[i]['data'].val + table[i+1]['data'].val});    table.splice(i,2);    table.unshift(parentNode);    table.sort(function(x,y){return x.data.val > y.data.val});  }  return table;}function encode(str, ret) {  if (typeof str !== 'string' || str.length < 1) {    return;  }  var i = 0;  var result = '';  while(str[i]) {    result += ret[str[i++]];  }  return result}function reverseRet(ret) {  var result = {};  for (key in ret) {    if(ret.hasOwnProperty(key)) {      result[ret[key]] = key;    }  }  return result;}function decode(str, ret) {  var i = 0;  var result = '';  var data = '';  var map = reverseRet(ret);  while(str) {    result += str[i++];    if (result in map) {      data += map[result];      str = str.replace(new RegExp("^"+result),'');      result = '';      i = 0;    }  }  console.log(data)}function traversal(tree, code, ret) {  if (tree.left !== null) {    traversal(tree.left, code + '0', ret);  } else {    ret[tree.data.key] = code;  }  if (tree.right !== null) {    traversal(tree.right,code + '1', ret);  } else {    ret[tree.data.key] = code;  }}var ret = {};var str = 'ew qew qd ef 24 gf ewr getElementsByTagName';traversal(makeTree(sort(cal(str)))[0],'', ret)decode(encode(str, ret), ret)btoa(encode(str,ret))

登录后复制

修改版

function Huffman(str) {  // 需要编码的字符串  this.str = str;  // 键和频率映射表  this.keyCountMap = null;  // 编码和键的映射表  this.codeKeyMap = {};  // 键和编码的映射表  this.keyCodeMap = {};  // 哈夫曼树节点列表  this.nodeList = null;  // 哈夫曼树根节点  this.root = null;  // 哈夫曼编码后的01序列  this.code = null;}Huffman.prototype.cal = function cal() {  str = this.str;  var map = {};  var i = 0;  while(str[i]) {    map[str[i]] ? map[str[i]]++ : (map[str[i]] = 1);    i++;  }  this.keyCountMap = map;}Huffman.prototype.sort = function sort() {  map = this.keyCountMap;  var result = [];  for (key in map) {    if(map.hasOwnProperty(key)) {      var obj = {        key: key,        val: map[key]      };      result.push(new Node(null, null, obj));    }  }  this.nodeList = result.sort(function(x,y){return x.data.val > y.data.val});}function Node(left, right, data) {  this.left = left;  this.right = right;  this.data = data;}Huffman.prototype.makeTree = function makeTree() {  var i = 0;  var len = this.nodeList.length;  var node1;  var node2;  var parentNode;  var table = this.nodeList;  while(table.length > 1) {    parentNode = new Node(table[i], table[i+1], {key: null, val: table[i]['data'].val + table[i+1]['data'].val});    table.splice(i,2);    table.unshift(parentNode);    table.sort(function(x,y){return x.data.val > y.data.val});  }  this.root = table[0] || new Node();  return this.root;}Huffman.prototype.traversal = function traversal(tree, code) {  if (tree.left !== null) {    traversal.call(this,tree.left, code + '0');  } else {    this.keyCodeMap[tree.data.key] = code;  }  if (tree.right !== null) {    traversal.call(this, tree.right,code + '1');  } else {    this.keyCodeMap[tree.data.key] = code;  }}Huffman.prototype.encode = function encode() {  this.cal();  this.sort();  var root = this.makeTree();  this.traversal(root, '');  var ret = this.keyCodeMap;  var i = 0;  var result = '';  var str = this.str;  while(str[i]) {    result += ret[str[i++]];  }  this.code = result;  console.log('encode:' + result);  return result}Huffman.prototype.reverseMap = function reverseMap() {  var ret = this.keyCodeMap;  var result = {};  for (key in ret) {    if(ret.hasOwnProperty(key)) {      result[ret[key]] = key;    }  }  this.codeKeyMap = result;  return result;}Huffman.prototype.decode = function decode() {  var i = 0;  var result = '';  var data = '';  var map = this.reverseMap();  var str = this.code;  while(str) {    result += str[i++];    if (result in map) {      data += map[result];      str = str.replace(new RegExp("^"+result),'');      result = '';      i = 0;    }  }  console.log("decode:" + data)}Huffman.prototype.encodeBase64 = function() {  try {    var base64 = btoa(this.code);    return base64;  } catch(e) {    return '';  }}var str = 'ew qew qd ef 24 gf ewr getElementsByTagName';var huffman = new Huffman(str)huffman.encode(str)huffman.decode();huffman.encodeBase64();

登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

nodejs读取去重excel步骤详解

js与typescript中class使用详解

以上就是源生js实现哈夫曼编码步骤详解的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2767103.html

(0)
上一篇 2025年3月8日 11:31:38
下一篇 2025年3月8日 11:31:44

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Angular CLI创建Angular项目步骤详解

    这次给大家带来Angular CLI创建Angular项目步骤详解,Angular CLI创建Angular项目的注意事项有哪些,下面就是实战案例,一起来看一下。 开始项目前,你需要先安装node和npm,然后执行npm install -…

    编程技术 2025年3月8日
    200
  • Angularjs中自定义指令使用技巧总结

    这次给大家带来Angularjs中自定义指令使用技巧总结,Angularjs中自定义指令使用的注意事项有哪些,下面就是实战案例,一起来看一下。 一:自定义指令常用模板 下面是大致的说明,不是全面的,后面来具体说明一些没有提及的细节和重要的相…

    编程技术 2025年3月8日
    200
  • jQuery插件highslide.js控制图片案例详解

    这次给大家带来jQuery插件highslide.js控制图片案例详解,jQuery插件highslide.js控制图片的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 今天用用了一款图片展示插件highslide.js,感觉用起来…

    2025年3月8日 编程技术
    200
  • JQuery元素操作详解

    这次给大家带来JQuery元素操作详解,JQuery元素操作的注意事项有哪些,下面就是实战案例,一起来看一下。 第一步:sizzle选择器 基于元素的id、类、类型、属性、属性值等”查找”(或选择)HTML元素,简单…

    编程技术 2025年3月8日
    200
  • nodeJS模块使用步骤详解

    这次给大家带来nodeJS模块使用步骤详解,nodeJS模块使用详解的注意事项有哪些,下面就是实战案例,一起来看一下。 1.定义Student模块,Teacher模块 function add(student){ console.log(‘…

    2025年3月8日
    200
  • JS做出随机数方法总结

    这次给大家带来JS做出随机数方法总结,JS做出随机数方法的注意事项有哪些,下面就是实战案例,一起来看一下。 var chars = [‘0′,’1′,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’A’,’B’,’C’,’…

    编程技术 2025年3月8日
    200
  • JS弹窗DIV并整背景颜色变化

    这次给大家带来JS弹窗DIV并整背景颜色变化,JS弹窗DIV并整背景颜色变化的注意事项有哪些,下面就是实战案例,一起来看一下。 1.首先写一个遮罩层p,然后再写一个弹窗的p 提示 js弹窗 js弹出p,并使整个页面背景变暗 确 定 登录后复…

    2025年3月8日
    200
  • JS调用模式与this关键字使用详解

    这次给大家带来JS调用模式与this关键字使用详解,JS调用模式与this关键字使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Invocation 调用 调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。 实参与形参不一…

    编程技术 2025年3月8日
    200
  • jquery layui弹出层使用详解

    这次给大家带来jquery layui弹出层使用详解,jquery layui弹出层使用的jquery有哪些,下面就是实战案例,一起来看一下。 Jquery必须大于1.83 layui必须是all,否则不显示 登录后复制 html代码 登录…

    编程技术 2025年3月8日
    200
  • AngularJS使用Filter自定义过滤器案列详解

    这次给大家带来AngularJS使用Filter自定义过滤器案列详解,AngularJS使用Filter自定义过滤器的注意事项有哪些,下面就是实战案例,一起来看一下。 本文实例讲述了AngularJS使用Filter自定义过滤器控制ng-r…

    2025年3月8日
    200

发表回复

登录后才能评论