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 学习笔记(十一)
Jan 19 Javascript
JavaScript获取表单enctype属性的方法
Apr 02 Javascript
jQuery+HTML5实现图片上传前预览效果
Aug 20 Javascript
JavaScript实现Base64编码转换
Apr 23 Javascript
JavaScript操作选择对象的简单实例
May 16 Javascript
js判断主流浏览器类型和版本号的简单实现代码
May 26 Javascript
设置jquery UI 控件的大小方法
Dec 12 Javascript
jQuery实现弹出窗口弹出div层的实例代码
Jan 09 Javascript
javascript 中的继承实例详解
May 05 Javascript
js随机生成一个验证码
Jun 01 Javascript
element-ui 关于获取select 的label值方法
Aug 24 Javascript
javascript验证form表单数据的案例详解
Mar 25 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
模仿OSO的论坛(三)
2006/10/09 PHP
php方法调用模式与函数调用模式简例
2011/09/20 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
PHP 如何获取二维数组中某个key的集合
2014/06/03 PHP
PHP查询并删除数据库多列重复数据的方法(利用数组函数实现)
2016/02/23 PHP
PHP+Ajax 检测网络是否正常实例详解
2016/12/16 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
node.js中的require使用详解
2014/12/15 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
jQuery获得子元素个数的方法
2015/04/14 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
bootstrap select插件封装成Vue2.0组件
2017/04/17 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
用python分割TXT文件成4K的TXT文件
2009/05/23 Python
初学Python实用技巧两则
2014/08/29 Python
Python中list查询及所需时间计算操作示例
2018/06/21 Python
获取python的list中含有重复值的index方法
2018/06/27 Python
一看就懂得Python的math模块
2018/10/21 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
python3 xpath和requests应用详解
2020/03/06 Python
python实现opencv+scoket网络实时图传
2020/03/20 Python
如何基于Python代码实现高精度免费OCR工具
2020/06/18 Python
如何利用python 读取配置文件
2021/01/06 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
维也纳通行证:Vienna PASS
2019/07/18 全球购物
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
学校欢迎标语
2014/06/18 职场文书
2014年党课学习心得体会
2014/07/08 职场文书
幼师辞职信怎么写
2015/02/27 职场文书