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 相关文章推荐
jQuery中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
日历查询的算法 如何计算某一天是星期几
Dec 12 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 Javascript
使用jQuery Ajax 请求webservice来实现更简练的Ajax
Aug 04 Javascript
js HTML5 Canvas绘制转盘抽奖
Sep 13 Javascript
微信小程序 获取相册照片实例详解
Nov 16 Javascript
JQuery ZTree使用方法详解
Jan 07 Javascript
JS正则表达式判断有效数实例代码
Mar 13 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
Aug 04 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
Vue2.0 http请求以及loading展示实例
Mar 06 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 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
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
PHP实现图片批量打包下载功能
2017/03/01 PHP
WordPress 插件——CoolCode使用方法与下载
2007/07/02 Javascript
jQuery boxy弹出层插件中文演示及使用讲解
2011/02/24 Javascript
JS基础之undefined与null的区别分析
2011/08/08 Javascript
jQuery学习笔记 更改jQuery对象
2012/09/19 Javascript
html dom节点操作(获取/修改/添加或删除)
2014/01/23 Javascript
js调试系列 源码定位与调试[基础篇]
2014/06/18 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
原生js FileReader对象实现图片上传本地预览效果
2020/03/27 Javascript
捕获未处理的Promise错误方法
2017/10/13 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Vue之mixin全局的用法详解
2018/08/22 Javascript
vue与bootstrap实现简单用户信息添加删除功能
2019/02/15 Javascript
微信小程序自定义组件传值 页面和组件相互传数据操作示例
2019/05/05 Javascript
[53:10]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs VG 第一场
2018/04/11 DOTA
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
python logging类库使用例子
2014/11/22 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
Python读取JSON数据操作实例解析
2020/05/18 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
keras输出预测值和真实值方式
2020/06/27 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
Python从文件中读取数据的方法步骤
2020/11/18 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
幼儿园教师请假制度
2014/01/16 职场文书
社会实践活动总结
2015/02/05 职场文书
先进教师个人主要事迹材料
2015/11/03 职场文书
react antd实现动态增减表单
2021/06/03 Javascript
《原神》新角色演示“神里绫人:林隐泓洄” 宠妹狂魔
2022/04/03 其他游戏
我的收音机情缘
2022/04/05 无线电