基于哈夫曼编码的文件压缩

本文详细介绍了如何使用哈夫曼编码进行文件压缩,包括构建哈夫曼树的过程,以及压缩和解压的实现步骤。在构建哈夫曼树时,通过小堆动态调整节点,最终形成唯一的一棵哈夫曼树。在压缩过程中,根据字符出现的频率生成哈夫曼编码,并写入压缩文件。解压时,重建哈夫曼树,按照编码路径还原字符。注意文件操作需以二进制方式进行,并特别处理汉字编码问题。
摘要由CSDN通过智能技术生成
本篇主要介绍如何利用哈夫曼编码使文件进行压缩、如何构建哈夫曼树
欢迎提出问题和建议
联系方式:blbagony@163.com
代码链接

哈夫曼树
  • 树的结构(节点结构)。两个指向叶子节点的指针、一个权值、一个指向父节点的指针(用来构建哈夫曼码)
template <class T>
struct HuffmanNode{
    T _wt;
    HuffmanNode<T>* _left;
    HuffmanNode<T>* _right;
    HuffmanNode<T>* _prev;
/*构造函数*/
    HuffmanNode(const T& w)
        :_wt(w)
        , _left(NULL)
        , _right(NULL)
        , _prev(NULL)
    {}
};
构建树


  • 首先我们从小堆(minHeap)中拿出最小的两个元素,用这两个元素的权值(weight)之和组成父节点权值,再将其父节点放入minHeap 中,当 minheap 中的节点只剩下 1 个时 hfm 树就构建完毕。其中 hfm 树根节点的 weight 是所有叶子节点 weight 之和。

huffman_tree 是构造出来的对象,size返回树中结点个数
每取一个 top 就 pop 一次,pop 函数自带调整。
取到最后一个时已经建立好 hfm 树。

while (huffman_tree.Size() > 1){
            Node* huffman_node_left = huffman_tree.Top();   huffman_tree.Pop();
            Node* huffman_node_right = huffman_tree.Top();  huffman_tree.Pop();

            Node* parent = new Node(huffman_node_left->_wt + huffman_node_right->_wt);
            parent->_left = huffman_node_left;
            huffman_node_left->_prev = parent;

            parent->_right = huffman_node_right;
            huffman_node_right->_prev = parent;

            huffman_tree.Push(parent);
        }
        _root = huffman_tree.Top();
  • 重载 () ,因为需要比较 weight 的仿函数ÿ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值