Huffman压缩算法

本文探讨了Huffman编码在数据压缩中的作用,利用符号概率进行高效编码。同时,介绍了Lempel-Ziv建模在文本压缩中的应用,该方法寻找文本中的冗余并转化为可编码的符号。对于音频和图像文件,由于其冗余形式不同,需要转换和分离组件以进行建模。完成建模后,再通过编码将信息压缩为位流。压缩过程涉及针对不同数据类型的建模和编码策略,对于损失压缩的情况,还会考虑消费者的接受度。
摘要由CSDN通过智能技术生成

霍夫曼和自适应的霍夫曼是编码的例子,它利用符号概率的统计偏斜,将其编码为尽可能少的位。(还有其他类型的编码,如算术、范围和不对称数字系统。

Lempel-Ziv 是建模的一个例子,它采用在压缩的特定类型的数据中发现的冗余,在此例文本中,并将其转换为一系列适合编码的符号。Lempel-Ziv 的工作假设是,文本中不会重复不同长度的字符串,这是自然语言的案例。

这种假设根本不适用于音频或图像文件,因为冗余的形式非常不同。在数据上执行转换,以按频率将组件分离出来,作为建模的一部分。此外,人类消费的音频和图像数据也可以接受损失压缩,根据数据在频率域中的落差,数据可以被丢弃或丢弃,并利用其他方法利用心理声学或心理视觉有效冗余。

完成此类建模后,可以应用类似的编码将生成的符号编码为最小尺寸的位流。

压缩包括建模,这在很大程度上取决于要压缩的数据类型,以及数据的消费者在损失压缩的情况下,其次是编码,将生成的信息压缩成压缩位流。

代码已更新以使用unique_ptr和命名空间。注:我试图实现匿名命名空间内的命名空间的命名空间,但它不允许将文件分成.cpp和.h.任何批评当前代码是受欢迎的。随意使用麻省理工学院协议中规定的代码。

#include"Huffman.h"
#include<fstream>
#include<sstream>
#include<algorithm>
#include<cstdlib>


/*----------------SHARED_FUNCTIONS_START----------------*/
Huffman::inner::smartNode Huffman::inner::makeTree(std::deque<smartNode>& nodeData) {
    while (nodeData.size() > 1) {
        std::sort(nodeData.begin(), nodeData.end(), functor());
        smartNode leftSon{ std::move(nodeData.back()) };
        nodeData.pop_back();
        smartNode rightSon{ std::move(nodeData.back()) };
        nodeData.pop_back();
        smartNode parent = std::make_unique<node>(std::move(leftSon), std::move(rightSon));
        nodeData.emplace_back(std::move(parent));
    }//end of while loop
    return std::move(nodeData.front());
}

void Huffman::inner::readFile(const std::string& filePath, std::string& fileContent) {
    std::ifstream inFile(filePath, std::ios::binary);
    if (inFile.is_open()) {
        auto const start_pos{ inFile.tellg() };
        inFile.ignore(std::numeric_limits<std::streamsize>::max());
        std::streamsize char_count{ inFile.gcount() };
        inFile.seekg(start_pos);
        fileContent = std::string(static_cast<std::size_t>(char_count), '0');
        inFile.read(&fileContent[0], static_cast<std::streamsize> (fileContent.size()));
        inFile.close();
    }//end of if
    else {
        std::cout << "Unable to open file\n";
        std::exit(EXIT_FAILURE);
    }//end of else
}

std::deque<Huffman
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值