根据字母出现的频率,运用哈夫曼树对字母进行编码,首先用哈夫曼算法建立一棵哈夫曼树。然后自下而上依次遍历每个叶子结点与根结点的路径,若当前结点是双亲结点的左结点,则编码字符串加0,右结点,加1。解码则依次将字符串前缀与编码表中的字母进行比对,若全部遍历完未找到,解码出错。难点在于哈夫曼树的构建,编码解码算法的设计。
目的:假设某文档只包含26个英文字母,应用哈夫曼算法对该文档进行压缩和解压缩操作,使得该文档占用较少的存储空间
要求:假设文档内容从键盘输入;设计哈夫曼算法的存储结构;设计哈夫曼编码的解码的算法;
步骤
(1)分析问题,抽象出数据模型,形成解题思路;
(2)将数据模型转换为机内表示,将想法描述成算法,用程序设计语言实现
详情请看下面代码:
#include <iostream>
#include <string>
using namespace std;
struct huffNode
{
int weight; //结点的权值,假设为整数
int parent,lchild,rchild; //parent保存该节点的双亲结点在数组中的下标,lchild保存该节点的左孩子结点在数组中的下标,rchild保存右孩子结点在数组中的下标
string s; //结点存储的字母的哈夫曼编码
string c; //结点存储的字母
};
class HuffmanTree
{
public:
HuffmanTree(string a[],int w[],int n)
{
int i,k,i0,i1;
num=n;
huffmanTree=new huffNode[2*num-1];
for(i=0;i<2*num-1;i++)
{
huffmanTree[i].parent=-1; //所有结点均没有双亲和孩子
huffmanTree[i].lchild=huffmanTree[i].rchild=-1;
huffmanTree[i].s="";
}
for(i=0;i<num;i++) //存储叶子结点的权值和对应字母
{
huffmanTree[i].c=a[i];
huffmanTree[i].weight=w[i];
}
for(k=num;k<2*num-1;k++) //共进行2*num-1次合并