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 相关文章推荐
javascript 框架小结 个人工作经验
Jun 13 Javascript
前淘宝前端开发工程师阿当的PPT中有JS技术理念问题
Jan 15 Javascript
在百度知道团队中快速审批新成员的js脚本
Feb 02 Javascript
sea.js常用的api简易文档
Nov 15 Javascript
jQuery实现遍历复选框的方法示例
Mar 06 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
vue中tab选项卡的实现思路
Nov 25 Javascript
three.js搭建室内场景教程
Dec 30 Javascript
jquery实现动态改变css样式的方法分析
May 27 jQuery
javascript 关于赋值、浅拷贝、深拷贝的个人理解
Nov 01 Javascript
vue实现整屏滚动切换
Jun 29 Javascript
JS highcharts动态柱状图原理及实现
Oct 16 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
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
PHP对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
js浮动图片的动态效果
2013/07/10 Javascript
js图片处理示例代码
2014/05/12 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
javascript高级选择器querySelector和querySelectorAll全面解析
2016/04/07 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
AngularJS教程 ng-style 指令简单示例
2016/08/03 Javascript
NodeJs的fs读写删除移动监听
2017/04/28 NodeJs
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
vue axios 简单封装以及思考
2018/10/09 Javascript
js判断复选框是否选中的方法示例【基于jQuery】
2019/10/10 jQuery
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
js仿淘宝放大镜效果
2020/12/28 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
python实现弹窗祝福效果
2019/04/07 Python
python数组循环处理方法
2019/08/26 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
pycharm不能运行.py文件的解决方法
2020/02/12 Python
Python格式化输出--%s,%d,%f的代码解析
2020/04/29 Python
Python try except else使用详解
2021/01/12 Python
PyQt5中QSpinBox计数器的实现
2021/01/18 Python
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
惠而浦美国官网:Whirlpool.com
2021/01/19 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
五一服装活动方案
2014/01/11 职场文书
干部个人对照检查材料
2014/08/25 职场文书
群众路线个人整改措施
2014/10/24 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
中秋节慰问信
2015/02/15 职场文书
canvas绘制折线路径动画实现
2021/05/12 Javascript