基于哈夫曼的文件压缩

首先构建Huffman树,定义节点,以及初始化HuffmanTree的创建过程。

#pragma once
#include <iostream>
#include <queue>


template<class T>
struct HuffmantreeNode
{
    HuffmantreeNode* left;
    HuffmantreeNode* right;
    HuffmantreeNode* parent;
    T date;

    HuffmantreeNode(const T& val = T())
        :left(nullptr)
        , right(nullptr)
        , parent(nullptr)
        ,date(val) 
    {}
};



template<class T>
class Huffmantree
{
    typedef HuffmantreeNode<T> Node;

    struct Compare
    {
        bool operator()(const Node* x, const Node* y)
        {
            return x->date > y->date;
        }
    };
    
public:
    Huffmantree()
        :root(nullptr)
    {}

    Huffmantree(const std::vector<T>& vw,const T& invalid) 
    {
        std::priority_queue<Node* , std::vector<Node*>,Compare> q;
        //1.使用权值来构建二叉树
        for (auto& e : vw)
        {
            if(invalid!=e)
                q.push(new Node(e));
        }

        while (q.size() > 1)
        {
            Node* left = q.top();
            q.pop();
            Node* right = q.top();
            q.pop();

            Node* parent = new Node(left->date + right->date);
            parent->left = left;
            parent->right = right;
            q.push(parent);
        }
        root = q.top();
    }
    Node* getroot()
    {
        return root;
    }

    ~Huffmantree()
    {
        Destroy(root);
    }
private:
    void Destroy(Node*& root)
    {
        if (root)
        {
            Destroy(root->left);
            Destroy(root->right);
            delete root;
            root = nullptr;
        }
    }
    Node* root;
};



紧接着通过文件来获取字符信息,因此需要定义一个类用来存储文件当中的字符信息,且构建byteinfo类来方便fileinfo存储文件信息,使得可以通过该信息构建Huffman树进行解压缩

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于哈夫曼树的文件压缩是一种常见的压缩算法。首先需要获取原文件中每个字节出现的次数,然后根据字节出现的频次信息构建哈夫曼树。接着,通过获取哈夫曼编码,将原文件中的字节用对应的哈夫曼编码来表示,从而实现文件压缩。 具体的步骤如下所示: 1. 获取原文件中每个字节出现的次数,可以使用哈希表等数据结构进行统计。 2. 根据字节出现的频次信息构建哈夫曼树。哈夫曼树的构建方法是通过选择权值最小的两个节点,将它们合并为一个新节点,直到最终构建出一棵完整的哈夫曼树。 3. 获取哈夫曼编码。通过遍历哈夫曼树,从根节点到每个叶节点的路径上的左右分支分别对应0和1,这样可以得到每个字节对应的哈夫曼编码。 4. 使用哈夫曼编码来改写文件,即将原文件中的每个字节用对应的哈夫曼编码来表示,从而实现文件压缩。 5. 如果需要解压缩文件,可以通过获取解压缩所需的信息,恢复哈夫曼树,并根据哈夫曼树对压缩后的文件进行解压缩。 总结起来,基于哈夫曼树的文件压缩主要包括获取原文件中每个字节出现的次数、构建哈夫曼树、获取哈夫曼编码和使用哈夫曼编码来改写文件。如果需要解压缩文件,则还需要恢复哈夫曼树并进行解压缩操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [基于哈夫曼编码的文件压缩](https://blog.csdn.net/Zyc_cucumber/article/details/119704749)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值