js神秘的电报密码 哈弗曼编码实现


Posted in Javascript onSeptember 10, 2019

这篇文章主要介绍了js神秘的电报密码 哈弗曼编码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

js神秘的电报密码 哈弗曼编码实现

js神秘的电报密码 哈弗曼编码实现

哈夫曼编码,根据每个单词在文本中出现的次数频率为权值,频率高的权值大。然后每次取两个频率最小的生成树,最后生成一颗大树。从根节点到该单词的路径,左边为0,右边为1,

function HFM(){
  var souce = [];   
  function createNode(node){
    var obj = {
      weight:0, 
      parent:-1,
      lchild:-1,
      rchild:-1,
      value:''
    };     
    return Object.assign(obj,node);
  }   
  this.addNode = function(node){
    //添加单词和频率(权值)
    souce.push(createNode(node));
  }   
  this.createTree = function(){
    //哈夫曼树
    var HuffNode = JSON.parse(JSON.stringify(souce));
    var n = HuffNode.length;     
    var x1,x2; //两个权值最小的索引
    var m1,m2;     //两个权值最小的值     
    for(var i = 0; i < n ; i++){
      m1 = m2 = Infinity; //初始化为最大值
      x1 = x2 = -1;       
      for(var j = 0; j < n+i; j++){ //寻找两个权值最小,且父节点为-1的
        var item = HuffNode[j];
        if(item.weight < m1 && item.parent == -1){
          m2 = m1;
          x2 = x1;           
          m1 = item.weight;
          x1 = j;
           
        }else if(item.weight < m2 && item.parent == -1){
          m2 = item.weight;;
          x2 = j;
        }
      }       
      if(x1 != -1 && x2 != -1){
        HuffNode[x1].parent = n + i; //更新父节点
        HuffNode[x2].parent = n + i;
         
        //创建一个新的节点
        HuffNode[n+i] = createNode({
          weight:m1+m2,
          lchild:x1,
          rchild:x2
        });
      }             
    }     
    return HuffNode;
  };   
  this.getCode = function(){
    //哈夫曼编码
    var n = souce.length;
    var tree = this.createTree();
    var codes = {};
    for(var i = 0; i < n; i++){
      var p = tree[i].parent;
      var code = '';
      var c = i;
      while(p != -1){ //迭代前溯
        if(tree[p].lchild == c){
          code = 0 + code;
        }else{
          code = 1 + code;
        }
        c = p;
        p = tree[p].parent;
      }       
      codes[ tree[i].value ] = code;
      console.log(tree[i].value , code);     
    }     
    return codes;
  }     
} 
var hfm = new HFM();
hfm.addNode({
  weight:5,
  value:"a"
});
hfm.addNode({
  weight:32,
  value:"b"
});
hfm.addNode({
  weight:18,
  value:"c"
});
hfm.addNode({
  weight:7,
  value:"d"
});
hfm.addNode({
  weight:25,
  value:"e"
});
hfm.addNode({
  weight:13,
  value:"f"
});
console.log(hfm.getCode())

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单(FORM)的一些实用效果代码
Mar 25 Javascript
javascript下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
javascript new 需不需要继续使用
Jul 02 Javascript
node.js WEB开发中图片验证码的实现方法
Jun 03 Javascript
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
JavaScript仿微博发布信息案例
Nov 16 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
Dec 26 Javascript
浅谈Vue数据绑定的原理
Jan 08 Javascript
vue编译打包本地查看index文件的方法
Feb 23 Javascript
Vue 实现一个命令式弹窗组件功能
Sep 25 Javascript
JavaScript实现图片轮播特效
Oct 23 Javascript
ES5新增数组的实现方法
May 12 Javascript
使用js实现一个简单的滚动条过程解析
Sep 10 #Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
Sep 10 #jQuery
Elasticsearch实现复合查询高亮结果功能
Sep 10 #Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 #Javascript
js获取 gif 的帧数的代码实例
Sep 10 #Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 #Javascript
js中console在一行内打印字符串和对象的方法
Sep 10 #Javascript
You might like
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
Php获取金书网的书名的实现代码
2010/06/11 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
JS实现从连接中获取youtube的key实例
2015/07/02 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
js简易版购物车功能
2017/06/17 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
2019/01/30 Javascript
layui问题之模拟table表格中的选中按钮选中事件的方法
2019/09/20 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
[31:01]2014 DOTA2国际邀请赛中国区预选赛5.21 CNB VS Orenda
2014/05/23 DOTA
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
python使用装饰器和线程限制函数执行时间的方法
2015/04/18 Python
Python调用adb命令实现对多台设备同时进行reboot的方法
2018/10/15 Python
配置 Pycharm 默认 Test runner 的图文教程
2018/11/30 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
pandas DataFrame运算的实现
2020/06/14 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
Subside Sports德国:足球球衣和球迷商品
2019/06/08 全球购物
中海讯通笔试题
2015/09/15 面试题
大学生社会实践评语
2014/04/25 职场文书
汽车检测与维修专业求职信
2014/07/04 职场文书
教书育人演讲稿
2014/09/11 职场文书
学习心理学的体会
2014/11/07 职场文书
会计工作能力自我评价
2015/03/05 职场文书
2016年春节问候语
2015/11/11 职场文书
六一儿童节致辞稿(3篇)
2019/07/11 职场文书
Go 自定义package包设置与导入操作
2021/05/06 Golang
详解JS ES6编码规范
2021/05/07 Javascript
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js