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