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 相关文章推荐
用jscript启动sqlserver
Jun 21 Javascript
JS date对象的减法处理实现代码
Dec 28 Javascript
JS动态添加option和删除option(附实例代码)
Apr 01 Javascript
js严格模式总结(分享)
Aug 22 Javascript
正则中的回溯定义与用法分析【JS与java实现】
Dec 27 Javascript
Node.js中文件操作模块File System的详细介绍
Jan 05 Javascript
vue-router路由与页面间导航实例解析
Nov 07 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
vue 实现在函数中触发路由跳转的示例
Sep 01 Javascript
React-redux实现小案例(todolist)的过程
Sep 29 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 Javascript
Vue实现导入Excel功能步骤详解
Jul 03 Vue.js
使用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 cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
php微信开发之图片回复功能
2018/06/14 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
JS实现兼容各种浏览器的高级拖动方法完整实例【测试可用】
2016/06/21 Javascript
jQuery无刷新上传之uploadify简单代码
2017/01/17 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
nodejs爬虫初试superagent和cheerio
2018/03/05 NodeJs
在vue项目中引入highcharts图表的方法(详解)
2018/03/05 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
JS中FormData类实现文件上传
2020/03/27 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
Python读取Word(.docx)正文信息的方法
2018/03/15 Python
Python实现针对给定字符串寻找最长非重复子串的方法
2018/04/21 Python
Flask框架配置与调试操作示例
2018/07/23 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
ubuntu16.04制作vim和python3的开发环境
2018/09/23 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
Python 如何调试程序崩溃错误
2020/08/03 Python
Python自动巡检H3C交换机实现过程解析
2020/08/14 Python
Django静态文件加载失败解决方案
2020/08/26 Python
python里反向传播算法详解
2020/11/22 Python
python录音并调用百度语音识别接口的示例
2020/12/01 Python
pycharm中leetcode插件使用图文详解
2020/12/07 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
小学运动会报道稿
2015/07/22 职场文书
《坐井观天》教学反思
2016/02/18 职场文书