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 相关文章推荐
js下用gb2312编码解码实现方法
Dec 31 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
JQuery中DOM实现事件移除的方法
Jun 13 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
JavaScript重载函数实例剖析
May 13 Javascript
第八篇Bootstrap下拉菜单实例代码
Jun 21 Javascript
javascript设计模式之中介者模式学习笔记
Feb 15 Javascript
对Vue.js之事件的绑定(v-on: 或者 @ )详解
Sep 15 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
Feb 27 Javascript
jquery+php后台实现省市区联动功能示例
May 23 jQuery
小程序click-scroll组件设计
Jun 18 Javascript
vue 实现购物车总价计算
Nov 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 rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
收集的网上用的ajax之chat.js文件
2007/04/08 Javascript
JS 获取span标签中的值的代码 支持ie与firefox
2009/08/24 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
JS实现对json对象排序并删除id相同项功能示例
2018/04/18 Javascript
Vue引用Swiper4插件无法重写分页器样式的解决方法
2018/09/27 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
vue实现滑动超出指定距离回顶部功能
2019/07/31 Javascript
Python通过websocket与js客户端通信示例分析
2014/06/25 Python
Python实现的百度站长自动URL提交小工具
2014/06/27 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
详解python:time模块用法
2019/03/25 Python
python实现图片转字符小工具
2019/04/30 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
python 调试冷知识(小结)
2019/11/11 Python
Python ellipsis 的用法详解
2020/11/20 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
香港唯港荟酒店预订:Hotel ICON
2018/03/27 全球购物
兰蔻英国官网:Lancome英国
2019/04/30 全球购物
外贸采购员求职的自我评价
2013/11/26 职场文书
幼儿园大班开学教师寄语
2014/04/03 职场文书
英语演讲稿3分钟
2014/04/29 职场文书
个人年终总结开头
2015/03/06 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
护理工作心得体会
2016/01/22 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
用JS实现飞机大战小游戏
2021/06/09 Javascript