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公共脚本库系列(一): 弹出层脚本
Feb 24 Javascript
jquery中的on方法使用介绍
Dec 29 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
Apr 16 Javascript
全面解析Bootstrap表单样式的使用
Sep 09 Javascript
微信小程序之仿微信漂流瓶实例
Dec 09 Javascript
创建一般js对象的几种方式
Jan 19 Javascript
canvas雪花效果核心代码分享
Feb 19 Javascript
详解Vue项目编译后部署在非网站根目录的解决方案
Apr 26 Javascript
微信小程序动态增加按钮组件
Sep 14 Javascript
angular.js实现列表orderby排序的方法
Oct 02 Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 Javascript
Vue动态组件和异步组件原理详解
May 06 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/02/03 PHP
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
PHP之将POST数据转化为字符串的实现代码
2016/11/03 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
Symfony查询方法实例小结
2017/06/28 PHP
thinkPHP利用ajax异步上传图片并显示、删除的示例
2018/09/26 PHP
JavaScript网页制作特殊效果用随机数
2007/05/22 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
js 实现浏览历史记录示例
2014/04/20 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
webpack学习笔记之优化缓存、合并、懒加载
2017/08/24 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
[01:20]DOTA2 2017国际邀请赛冠军之路无止竞
2017/06/19 DOTA
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python 画图 图例自由定义方式
2020/04/17 Python
python爬虫用mongodb的理由
2020/07/28 Python
美国购买肉、鸭、家禽、鹅肝和熟食网站:D’Artagnan
2018/11/13 全球购物
有趣的流行文化T恤、马克杯、手机壳和更多:Look Human
2019/01/07 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
教师实习自我鉴定
2013/12/14 职场文书
2014年元旦感言
2014/03/06 职场文书
代理人委托书
2014/08/01 职场文书
党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2014年基建工作总结
2014/12/12 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
Vue h函数的使用详解
2022/02/18 Vue.js
nginx日志格式分析和修改
2022/04/28 Servers
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL
Windows11 Insider Preview Build 25206今日发布 更新内容汇总
2022/09/23 数码科技