C++ 哈夫曼树对文件压缩、加密实现代码哈夫曼树对文件压缩、加密实现代码
主要介绍了C++ 哈夫曼树对文件压缩、加密实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在以前写LZW压缩算法的时候,遇到很多难受的问题,基本上都在哈夫曼编码中解决了,虽然写这代码很费神,但还是把代
码完整的码出来了,毕竟哈夫曼这个思想确实很牛逼。哈夫曼树很巧妙的解决了当时我在LZW序列化的时候想解决的问题,
就是压缩后文本的分割。比如用lzw编码abc,就是1,2,3。但这个在存为文件的时候必须用分割符把1,2,3分割开,非常浪费空
间,否则会和12 23 123 产生二义性。而哈夫曼树,将所有char分布在叶节点上,在还原的时候,比如1101110,假设110是
叶节点,那么走到110的时候就可以确定,已经走到尽头,回到根节点继续走,这样就避免了字符的分割,全部用
1010101010101这样的路径表示字符,可以将8位压缩为1个char进行存储。在构造树的时候,将出现率高的char放在上面,
这样路径就很短,自然就节省了存储空间。虽然哈夫曼压缩效率不是最高的,但还算比较乐观的。
哈夫曼除了压缩以外还可以用于加密,在将文本用哈夫曼编码时,需持久化生成的char计数链表结构,这样才能还原出树结
构,而解码时路径正是依赖于树结构的。也就是说,这种编码是属于约定形式的编码,在编码时用原文本产生树结构,而存储
的是树路径,解码的时候缺少树或树结构与原先不相符都是无法完成解码的,就好比,我用10代表a,你存的是10,你将10解
释为 b或c等等都是不正确的。由于转换为了char存储,所以还需持久化最后填充的数目、文本长度,才能还原出原先的01表
示的文本格式
这个代码有一定缺陷,由于当时考虑的是对文本进行处理,当文件中有char=' ' 时会出现错误,这个代码打的很费神,就不继
续修复了,如有需要,可自行更改,解决的办法应该挺多的
先来个运行图:
源代码
#include<iostream>
#include<sstream>
#include<fstream>
void WriteFile(char* path,const char* content,int length,bool append=false);
using namespace std;
struct Node{
char data;
Node* left;
Node* right;
};
struct L_Node{
int count;
Node* node;
L_Node* next;
};
Node* AddNode(int count,char data,L_Node*& first){
L_Node* lnode=new L_Node();
lnode->count=count;
Node* node=new Node();
node->data=data;
node->left=0;
node->right=0;
lnode->node=node;
if(first==0){
first=lnode;
}
else{
if(lnode->count<first->count){
lnode->next=first;
first=lnode;
}
else{