js神秘的电报密码---哈弗曼编码
2024-10-10 08:46:40
哈夫曼编码,根据每个单词在文本中出现的次数频率为权值,频率高的权值大。然后每次取两个频率最小的生成树,最后生成一颗大树。从根节点到该单词的路径,左边为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())
最新文章
- [ASE][Daily Scrum]11.26
- uva 572 oil deposits——yhx
- Eclipse 上安装 Maven3插件
- JavaScript要点(十三) HTML DOM EventListener
- JAVA中的继承和覆盖
- Android与服务器端数据交互(转)
- jq操作radio,设置选中、获取选中值
- 连续子序列最大和的O(NlogN)算法
- 如何使用Git以及GitHub
- Chapter 5 Blood Type——26
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动
- redis-cli显示中文
- How to Create a First Shell Script
- spring Environment
- makefile中的gcc -o $@ $^是什么意思?
- python之模块定义、导入、优化详解
- php-beanstalkd消息队列类分享
- 【转帖】M1、M2增速
- tornado上传大文件以及多文件上传
- SPSS数据类型:测量字段、角色字段
热门文章
- 微信小程序获取到Openid
- 【Vue】---编写Vue插件流程---【巷子】
- Asp.NET调用有道翻译API
- sql优化的方法
- C# 方法中的this参数
- 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS
- 使用qemu模拟调试内核和debian根文件系统
- [developmemt][dpdk] dpdk优化(转)
- 哨兵模式下,master选举关键点
- elasticsearch 出现“java.lang.OutOfMemoryError: Java heap space”