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 相关文章推荐
分析Node.js connect ECONNREFUSED错误
Apr 09 Javascript
Jquery.addClass始终无效原因分析
Sep 08 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
Apr 10 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
Jan 05 Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 Javascript
基于jQuery的Web上传插件Uploadify使用示例
May 19 Javascript
轻松实现js选项卡切换效果
Sep 24 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
Nov 21 Javascript
javascript中活灵活现的Array对象详解
Nov 30 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
Vue通过input筛选数据
Oct 26 Javascript
addeventlistener监听scroll跟touch(实例讲解)
Aug 04 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
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
PDO::quote讲解
2019/01/29 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
用js实现预览待上传的本地图片
2007/03/15 Javascript
JavaScript RegExp方法获取地址栏参数(面向对象)
2009/03/10 Javascript
FileUpload 控件 禁止手动输入或粘贴的实现代码
2010/04/07 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
jQuery实现防止提交按钮被双击的方法
2015/03/24 Javascript
JS+CSS实现另类带提示效果的竖向导航菜单
2015/10/15 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
2016/10/26 Javascript
vue获取input输入值的问题解决办法
2017/10/17 Javascript
JS 获取文件后缀,判断文件类型(比如是否为图片格式)
2020/05/09 Javascript
Python基于百度AI的文字识别的示例
2018/04/21 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
python实现按首字母分类查找功能
2019/10/31 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
css3动画事件—webkitAnimationEnd与计时器time事件
2013/01/31 HTML / CSS
世界上最大的餐具公司:Oneida
2016/12/17 全球购物
在购买印度民族服饰:Soch
2020/09/15 全球购物
类的返射机制中的包及核心类
2016/09/12 面试题
实习生自我评价
2014/01/18 职场文书
人事专员工作职责
2014/02/22 职场文书
2014年两会学习心得体会
2014/03/17 职场文书
新闻发布会策划方案
2014/06/12 职场文书
2015年幼儿园中班工作总结
2015/04/25 职场文书
高考诚信考试承诺书
2015/04/29 职场文书
幼儿园教师个人工作总结2015
2015/05/12 职场文书
中考百日冲刺决心书
2015/09/22 职场文书
基于Python实现股票收益率分析
2022/04/02 Python
V Rising 服务器搭建图文教程
2022/06/16 Servers