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实际应用:innerHTMl和确认提示的使用
Jun 22 Javascript
jquery select选中的一个小问题
Oct 11 Javascript
jquery中ajax学习笔记4
Oct 16 Javascript
JS删除字符串中重复字符方法
Mar 09 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
Oct 09 Javascript
jQuery实现ctrl+enter(回车)提交表单
Oct 19 Javascript
AngualrJS中的Directive制作一个菜单
Jan 26 Javascript
微信小程序 实现tabs选项卡效果实例代码
Oct 31 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
Vue.js 中的 v-show 指令及用法详解
Nov 19 Javascript
ElementUI实现el-form表单重置功能按钮
Jul 21 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代码优化及php相关问题总结
2006/10/09 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
Laravel第三方包报class not found的解决方法
2019/10/13 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
iframe 自适应高度[在IE6 IE7 FF下测试通过]
2009/04/13 Javascript
jQuery编写widget的一些技巧分享
2010/10/28 Javascript
return false,对阻止事件默认动作的一些测试代码
2010/11/17 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
鼠标滚轮改变图片大小的示例代码
2013/11/20 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
Jquery检验手机号是否符合规则并根据手机号检测结果将提交按钮设为不同状态
2015/11/26 Javascript
AngularJS通过ng-route实现基本的路由功能实例详解
2016/12/13 Javascript
jQuery 实现图片的依次加载图片功能
2017/07/06 jQuery
ReactJs实现树形结构的数据显示的组件的示例
2017/08/18 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
[48:44]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS HGT
2014/05/22 DOTA
王纯业的Python学习笔记 下载
2007/02/10 Python
python sort、sorted高级排序技巧
2014/11/21 Python
Django 登陆验证码和中间件的实现
2018/08/17 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
CSS3+Sprite实现僵尸行走动画特效源码
2016/01/27 HTML / CSS
HTML5新特性 多线程(Worker SharedWorker)
2017/04/24 HTML / CSS
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
伊莱克斯(Electrolux)俄罗斯网上商店:瑞典家用电器品牌
2021/01/23 全球购物
汽车驾驶求职信
2013/10/25 职场文书
大学生自我鉴定
2013/12/16 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
学习与创新自我评价
2015/03/09 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python