利用库中的优先级队列实现哈夫曼树,最后基于哈夫曼树最终实现文件压缩。
描述:
1.统计文件中字符出现的次数,利用优先级队列构建Haffman树,生成Huffman编码。
构造过程可以使用priority_queue辅助,每次pq.top()都可以取出权值(频数)最小的节点。每取出两个最小权值的节点,就new出一个新的节点,左右孩子分别指向它们。然后把这个新节点push进优先队列。
2.压缩:利用Haffman编码对文件进行压缩,即在压缩文件中按顺序存入每个字符的Haffman编码。
3.将文件中出现的字符以及它们出现的次数写入配置文件中,以便后续压缩使用。
4.减压缩:利用配置文件重构Haffman树,对文件进行减压缩。
构建哈夫曼树
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include <queue>
#include<vector>
using namespace std;
template<class W>
struct HuffmanTreeNode
{
HuffmanTreeNode(const W &weight)
: _pLeft(NULL)
, _pRight(NULL)
, _pParent(NULL)
, _weight(weight)
{}
HuffmanTreeNode<W>*_pLeft;
HuffmanTreeNode<W>*_pRight;
HuffmanTreeNode<W>*_pParent;
W _weight;
};
template<class W>
class HuffmanTree
{
typedef HuffmanTreeNode<W>*PNode;
public:
HuffmanTree()
: _pRoot(NULL)
{}
HuffmanTree(W*array, size_t size, const W&invalid)
{
_CreateHuffmantree(array, size, invalid);
}
void _Destroy(PNode&pRoot)
{
//后序
if (pRoot)
{
_Destroy(pRoot->_pLeft);
_Destroy(pRoot->_pRight);
delete pRoot;
pRoot = NULL;
}
}
~HuffmanTree()
{
_Destroy(_pRoot);
}
PNode GetRoot()
{
return _pRoot;
}
private:
//构建哈夫曼树
void _CreateHuffmantree(W*array, size_t size, const W&invalid)
{
struct PtrNodeCompare
{
bool operator()(PNode n1, PNode n2)//重载“()”
{
//return (n1->_weight)._count > (n1->_weight)._count;
return n1->_weight < n2->_weight;
}
};
priority_queue<PNode, vector<PNode>, PtrNodeCompare>hp;
for (size_t i = 0; i < size; ++i)
{
if (array[i] !=