哈夫曼编码,根据每个单词在文本中出现的次数频率为权值,频率高的权值大。然后每次取两个频率最小的生成树,最后生成一颗大树。从根节点到该单词的路径,左边为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())

  

js神秘的电报密码---哈弗曼编码的更多相关文章

  1. C++哈弗曼编码

    // haffman.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using name ...

  2. 用C++实现文件压缩(1 哈弗曼编码)

    今天下午想把文件压缩写一下,因为我觉得这个还是比较锻炼技术的,对数据结构的要求应该比较高,权当练习了吧. 我采用的压缩方式是Huffman编码,不过比较囧的是,我拼写拼错了,我拼的是haffman,在 ...

  3. java 哈夫曼编码

    //哈夫曼树类 public class HaffmanTree { //最大权值 ; int nodeNum ; //叶子结点个数 public HaffmanTree(int n) { this. ...

  4. 哈弗曼实现(C++)

    HuffmanCode.h #ifndef HUFFMANCODE_H #define HUFFMANCODE_H enum LRSTATUS { LEFTCHILD, //左子树 RIGHTCHIL ...

  5. K:哈弗曼树

    相关介绍:  树形结构除了应用于查找和排序等操作时能调高效率,它在信息通讯领域也有着广泛的应用.哈弗曼(Huffman)树就是一种在编码技术方面得到广泛应用的二叉树,它同时也是一种最优二叉树. 哈弗曼 ...

  6. 数据压缩之经典——哈夫曼编码(Huffman)

    (笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...

  7. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  8. java实现哈弗曼树

    O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”.哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如 ...

  9. 哈弗曼树的理解和实现(Java)

    哈弗曼树概述 哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途.哈弗曼树的定义,涉及路径.路径长度.权等概念.哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等. 哈弗曼树的一些定 ...

随机推荐

  1. 一块移动硬盘怎样兼容Mac和Windows系统,并且可以在time machine上使用

    Mac的内存通常不是很大,加上使用Mac的time machine备份的话,是需要外置U盘或硬盘的.U盘存储空间较小,大家也不会去分区,直接拿来用在Mac上或者Windows上就可以了.所以这里只说硬 ...

  2. Processing-基础小坑-

    x 坑A:) 新建一个"Walker"项目,Walker.pde,必须在Walker文件夹下... 刚开始以为如果一个文件需要引用另外一个文件中的类,只要把这两个文件放一个文件夹下 ...

  3. JNUOJ 1032 - 食物处理器

    题目链接:http://jnuacm.club:8080/oj/problem_show.php?pid=1032   小明喜欢把土豆块放在食物处理器中处理.长度不超过H的土豆块放入处理器中,处理器每 ...

  4. [No0000192]Vim打开和保存文件-Vim使用技巧(7)

    使用Vim打开和保存文件是最常用的操作,介绍使用edit命令通过文件路径来打开文件,使用write命令保存文件,当文件路径不存在或用户权限不匹配时,使用write命令调用外部shell程序完成操作. ...

  5. [No0000142]Outlook通过添加签名 自动添加邮件模板

    新建邮件->alt+F9切换域代码显示. 编写好模板后,全选复制到签名. 2018/05/7_加班申请_高亚斌 工号 姓名 开始时间 结束时间 工作事项 160227 高亚斌 2018/05/7 ...

  6. Srt字幕文件解析

    // // ViewController.m // 字幕解析 // // Created by admin on 2018/8/30. // Copyright © 2018年 admin. All ...

  7. ionic中调用cordova插件upload上传的问题,拍照and调用相册

    第一次写博客直接怼代码 首先应该 ionic cordova plugin add cordova-plugin-file-transfer npm install --save @ionic-nat ...

  8. python的数据库链接

    https://blog.csdn.net/canofy/article/details/83294330#-*-coding:utf-8-*-import MySQLdb #yum update p ...

  9. elasticsearch解决控制台中文乱码问题

    找到conf目录下的jvm.options文件,找到如下的配置行: 我将之前的UTF-8 改成GBK,ok.

  10. 【Python爬虫】PyQuery解析库

    PyQuery解析库 阅读目录 初始化 基本CSS选择器 查找元素 遍历 获取信息 DOM操作 伪类选择器 PyQuery 是 Python 仿照 jQuery 的严格实现.语法与 jQuery 几乎 ...