哈夫曼算法的应用:对文档进行压缩和解压

根据字母出现的频率,运用哈夫曼树对字母进行编码,首先用哈夫曼算法建立一棵哈夫曼树。然后自下而上依次遍历每个叶子结点与根结点的路径,若当前结点是双亲结点的左结点,则编码字符串加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次合并
        
  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值