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 相关文章推荐
让你的CSS像Jquery一样做筛选的实现方法
Jul 10 Javascript
JS面向对象编程浅析
Aug 28 Javascript
仿谷歌主页js动画效果实现代码
Jul 14 Javascript
JavaScript获取当前页面上的指定对象示例代码
Feb 28 Javascript
在linux中使用包管理器安装node.js
Mar 13 Javascript
jquery京东商城双11焦点图多图广告特效代码分享
Sep 06 Javascript
JSONObject使用方法详解
Dec 17 Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 Javascript
在 Vue-CLI 中引入 simple-mock实现简易的 API Mock 接口数据模拟
Nov 28 Javascript
原生js实现3D轮播图
Mar 21 Javascript
vue 全局环境切换问题
Oct 27 Javascript
vue Tab切换以及缓存页面处理的几种方式
Nov 05 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php设计模式 Command(命令模式)
2011/06/26 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
PHP反射类ReflectionClass和ReflectionObject的使用方法
2013/11/13 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
javascript学习笔记(一) 在html中使用javascript
2012/06/18 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
详解vue-admin和后端(flask)分离结合的例子
2018/02/12 Javascript
vue项目首屏加载时间优化实战
2019/04/23 Javascript
通过js实现压缩图片上传功能
2020/02/25 Javascript
[53:03]Optic vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
python迭代器的使用方法实例
2013/11/21 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
VSCode Python开发环境配置的详细步骤
2019/02/22 Python
关于pytorch中网络loss传播和参数更新的理解
2019/08/20 Python
Python函数基本使用原理详解
2020/03/19 Python
带你学习Python如何实现回归树模型
2020/07/16 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
领先的荷兰线上超市:荷兰之家Holland at Home(支持中文)
2021/01/21 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
Python的两道面试题
2013/06/29 面试题
学生实习自我鉴定
2013/10/11 职场文书
办公室驾驶员岗位职责
2013/11/15 职场文书
前台接待员岗位职责
2014/01/02 职场文书
小学生打架检讨书
2014/01/26 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
食品销售计划书
2014/04/26 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
委托书的写法
2014/08/30 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
Python中的datetime包与time包包和模块详情
2022/02/28 Python