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

  

最新文章

  1. [ASE][Daily Scrum]11.26
  2. uva 572 oil deposits——yhx
  3. Eclipse 上安装 Maven3插件
  4. JavaScript要点(十三) HTML DOM EventListener
  5. JAVA中的继承和覆盖
  6. Android与服务器端数据交互(转)
  7. jq操作radio,设置选中、获取选中值
  8. 连续子序列最大和的O(NlogN)算法
  9. 如何使用Git以及GitHub
  10. Chapter 5 Blood Type——26
  11. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(9)- 从Parallel NOR启动
  12. redis-cli显示中文
  13. How to Create a First Shell Script
  14. spring Environment
  15. makefile中的gcc -o $@ $^是什么意思?
  16. python之模块定义、导入、优化详解
  17. php-beanstalkd消息队列类分享
  18. 【转帖】M1、M2增速
  19. tornado上传大文件以及多文件上传
  20. SPSS数据类型:测量字段、角色字段

热门文章

  1. 微信小程序获取到Openid
  2. 【Vue】---编写Vue插件流程---【巷子】
  3. Asp.NET调用有道翻译API
  4. sql优化的方法
  5. C# 方法中的this参数
  6. 一劳永逸:域名支持通配符,ASP.NET Core中配置CORS
  7. 使用qemu模拟调试内核和debian根文件系统
  8. [developmemt][dpdk] dpdk优化(转)
  9. 哨兵模式下,master选举关键点
  10. elasticsearch 出现“java.lang.OutOfMemoryError: Java heap space”