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 相关文章推荐
JQuery为textarea添加maxlength属性的代码
Apr 07 Javascript
JavaScript高级程序设计(第3版)学习笔记7 js函数(上)
Oct 11 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
Jan 23 Javascript
关于js数组去重的问题小结
Jan 24 Javascript
文本域中换行符的替换示例
Mar 04 Javascript
jQuery 删除/替换DOM元素的几种方式
May 20 Javascript
JS实现为表格动态添加标题的方法
Mar 31 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
Dec 18 Javascript
最简单的tab切换实例代码
May 13 Javascript
html5+CSS 实现禁止IOS长按复制粘贴功能
Dec 28 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
Vue 3.0中jsx语法的使用
Nov 13 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
Admin generator, filters and I18n
2011/10/06 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
JavaScript时间转换处理函数
2015/04/14 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
js实现tab切换效果实例
2015/09/16 Javascript
JavaScript实现斗地主游戏的思路
2016/02/29 Javascript
实例详解ECMAScript5中新增的Array方法
2016/04/05 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
js实现定时进度条完成后切换图片
2017/01/04 Javascript
JS分页的实现(同步与异步)
2017/09/16 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
pyqt5对用qt designer设计的窗体实现弹出子窗口的示例
2019/06/19 Python
pytorch在fintune时将sequential中的层输出方法,以vgg为例
2019/08/20 Python
Python numpy.zero() 初始化矩阵实例
2019/11/27 Python
将tensorflow模型打包成PB文件及PB文件读取方式
2020/01/23 Python
python argparse传入布尔参数false不生效的解决
2020/04/20 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
10条PHP编程习惯
2014/05/26 面试题
某公司C#程序员面试题笔试题
2014/05/26 面试题
见习报告格式范文
2014/11/08 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
办公室卫生管理制度
2015/08/04 职场文书
高中军训感想
2015/08/07 职场文书
js之ajax文件上传
2021/05/13 Javascript
关于JavaScript 中 if包含逗号表达式
2021/11/27 Javascript
Redis分布式锁的7种实现
2022/04/01 Redis