前言
哈夫曼树是数据压缩编码算法的基础,本文使用JavaScript语言实现了该算法。
算法流程:输入待编码的字符串,算法去构造哈夫曼树,从而实现对字符串的二进制压缩编码。
对于哈夫曼树理论的学习,可去参见其他文章。本文仅包含实现的代码以及注释。
注释比较丰富,相信不难理解。
算法实现
树节点
既然是树数据结构,就要有树节点,下面是树节点定义
class Node {
constructor(value, char, left, right) {
this.val = value; // 字符出现次数
this.char = char; // 待编码字符
this.left = left;
this.right = right;
}
}
一般来说,节点只需要val,left,right即可,这里加了一个char字段,表示该节点代表待编码字符串里面的哪个字符,当前节点是叶子节点的时候,会赋值这个字段。
核心代码
构造函数
class huffmanTree{
constructor(str){
// 第一步,统计字符出现频率
let hash = {};
for(let i = 0; i < str.length; i++){
hash[str[i]] = ~~hash[str[i]] + 1;
}
this.hash = hash;
// 第二步,构造哈夫曼树
this.huffmanTree = this.getHuffmanTree();
// 第三步,遍历哈夫曼树,得到编码表
let map = this.getHuffmanCode(this.huffmanTree);
// 查看编码表,即每个字符的二进制编码是什么
console.log(map);
// 第四部,根据编码对照表,返回最终的二进制编码
this.binaryStr = this.getBinaryStr(map, str);
}
}
下面我们逐一的看一下,(1)构造哈夫曼树的过程、