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())
js神秘的电报密码---哈弗曼编码的更多相关文章
- C++哈弗曼编码
// haffman.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using name ...
- 用C++实现文件压缩(1 哈弗曼编码)
今天下午想把文件压缩写一下,因为我觉得这个还是比较锻炼技术的,对数据结构的要求应该比较高,权当练习了吧. 我采用的压缩方式是Huffman编码,不过比较囧的是,我拼写拼错了,我拼的是haffman,在 ...
- java 哈夫曼编码
//哈夫曼树类 public class HaffmanTree { //最大权值 ; int nodeNum ; //叶子结点个数 public HaffmanTree(int n) { this. ...
- 哈弗曼实现(C++)
HuffmanCode.h #ifndef HUFFMANCODE_H #define HUFFMANCODE_H enum LRSTATUS { LEFTCHILD, //左子树 RIGHTCHIL ...
- K:哈弗曼树
相关介绍: 树形结构除了应用于查找和排序等操作时能调高效率,它在信息通讯领域也有着广泛的应用.哈弗曼(Huffman)树就是一种在编码技术方面得到广泛应用的二叉树,它同时也是一种最优二叉树. 哈弗曼 ...
- 数据压缩之经典——哈夫曼编码(Huffman)
(笔记图片截图自课程Image and video processing: From Mars to Hollywood with a stop at the hospital的教学视频,使用时请注意 ...
- 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)
前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...
- java实现哈弗曼树
O(∩_∩)O~~ 概述 我想学过数据结构的小伙伴一定都认识哈弗曼,这位大神发明了大名鼎鼎的“最优二叉树”,为了纪念他呢,我们称之为“哈弗曼树”.哈弗曼树可以用于哈弗曼编码,编码的话学问可就大了,比如 ...
- 哈弗曼树的理解和实现(Java)
哈弗曼树概述 哈弗曼树又称最优树,是一种带权路径长度最短的树,在实际中有广泛的用途.哈弗曼树的定义,涉及路径.路径长度.权等概念.哈弗曼树可以用于哈弗曼编码,用于压缩,用于密码学等. 哈弗曼树的一些定 ...
随机推荐
- UDP协议的例子
public class Service { // 服务器 public static void main(String[] args) { Datagra ...
- Flask web开发之路九
flask_scripts介绍 项目结构如下: flask_script_demo.py文件: from flask import Flask app = Flask(__name__) @app.r ...
- 电子产品使用感受之--Windows 10 小米笔记本Air HDMI转VGA无信号问题
最近一直通过HDMI转VGA线缆链接我的戴尔P2314H显示器,前天睡觉前,看到电脑上英伟达显卡推了驱动更新,顺手更新了一下,就去睡觉了,转天晚上再用,HDMI接口就没有信号了,上网查了一些信息,获知 ...
- Codeforces 279C - Ladder - [简单DP]
题目链接:http://codeforces.com/problemset/problem/279/C 题意: 给出 $n$ 个整数 $a[1 \sim n]$,$m$ 个查询,对于一个查询 $[l_ ...
- [No000014A]Linux简介与shell编程
Linux 介绍 内核 库: .so 共享对象,windows:dll 动态链接库 应用程序 Linux的基本原则: 1.由目的单一的小程序组成:组合小程序完成复杂任务: 2.一切皆文件: 3.尽量避 ...
- 【魔改】莫队算法+组合数公式 杭电多校赛4 Problem B. Harvest of Apples
http://acm.hdu.edu.cn/showproblem.php?pid=6333 莫队算法是一个离线区间分块瞎搞算法,只要满足:1.离线 2.可以O(1)从区间(L,R)更新到(L±1, ...
- Sethi model
小结: 1. 销量 广告 微分方程 动态系统 市场份额 https://en.wikipedia.org/wiki/Sethi_model The Sethi model was developed ...
- Chap7:民间用语[《区块链中文词典》维京&甲子]
- [ovs] ovs开启日志debug
如题 [root@vrouter1 ~]# ovs-appctl vlog/set netdev:file:dbg [root@vrouter1 ~]# ovs-appctl vlog/set net ...
- Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比
Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法 os.system('ll /data/') 但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...