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 相关文章推荐
页面中body onload 和 window.onload 冲突的问题的解决
Jul 01 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
Oct 11 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
Oct 16 Javascript
你未必知道的JavaScript和CSS交互的5种方法
Apr 02 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
jQuery实现图片左右滚动特效
Apr 20 Javascript
Node.js与Sails redis组件的使用教程
Feb 14 Javascript
详解vue组件化开发-vuex状态管理库
Apr 10 Javascript
ES6学习教程之块级作用域详解
Oct 09 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
JS实现超级好看的鼠标小尾巴特效
Dec 01 Javascript
JavaScript实现通讯录功能
Dec 27 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验证码函数代码(简单实用)
2013/09/29 PHP
ThinkPHP基于PHPExcel导入Excel文件的方法
2014/10/15 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
自己的js工具 Event封装
2009/08/21 Javascript
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
非常棒的10款jQuery 幻灯片插件
2011/06/14 Javascript
YUI Compressor压缩JavaScript原理及微优化
2013/01/07 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
jquery中checkbox全选失效的解决方法
2014/12/26 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
解决webpack多页面内存溢出的方法示例
2019/10/08 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
wxpython中自定义事件的实现与使用方法分析
2016/07/21 Python
有趣的python小程序分享
2017/12/05 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python装饰器代替set get方法实例
2019/12/19 Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
2020/01/20 Python
在django项目中导出数据到excel文件并实现下载的功能
2020/03/13 Python
Pyspark读取parquet数据过程解析
2020/03/27 Python
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
.net面试题
2016/09/17 面试题
生产部厂长助理职位说明书
2014/03/03 职场文书
小学生演讲稿大全
2014/04/25 职场文书
《从现在开始》教学反思
2016/02/16 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle
golang用type-switch判断interface的实际存储类型
2022/04/14 Golang