赫夫曼编码是该思想的应用,将频率出现较多的字母定义为长度较短的二进制,将出现频率小的定义为长度大的二进制,这样有效的提高了存储能力,赫夫曼树的用处还很多,这种思想可以提高程序运行效率,如在多个判断语句中,可以将访问较多的条件放在第一个位置,减小其访问权重。
#ifndef HUFFMANNODE_H #define HUFFMANNODE_H #include <iostream> using namespace std; class HuffmanNode { public: HuffmanNode(); HuffmanNode(int weight); void SetWeight(int weight); int GetWeight(); void SetCode(int weight); int GetCode(); void Display(); virtual ~HuffmanNode(); HuffmanNode* leftNode; HuffmanNode* rightNode; HuffmanNode* parentNode; protected: int nWeight; int nCode;
private: };
#endif // HUFFMANNODE_H
#ifndef HUFFMANTREE_H #define HUFFMANTREE_H #include "./HuffmanNode.h" #include <vector> #include <iostream> using namespace std; class HuffmanTree { public: HuffmanTree(); void CreateDate(); void CreateTree(); void PreOrderVisit(HuffmanNode* node); virtual ~HuffmanTree(); HuffmanNode* headNode; protected: int* weight; int len; private: }; #endif // HUFFMANTREE_H
#include "../include/HuffmanNode.h"
HuffmanNode::HuffmanNode() { nWeight = 0; nCode = 0; leftNode = NULL; rightNode = NULL; parentNode = NULL; } HuffmanNode::HuffmanNode(int weight) { nWeight = weight; nCode = 0; leftNode = NULL; rightNode = NULL; parentNode = NULL; } void HuffmanNode::SetWeight(int weight) { nWeight = weight; } int HuffmanNode::GetWeight() { return nWeight; }void HuffmanNode::SetCode(int code) { nCode = code; } int HuffmanNode::GetCode() { return nCode; } void HuffmanNode::Display() { cout<<nCode<<" "; } HuffmanNode::~HuffmanNode() { //dtor }
#include "../include/HuffmanTree.h" #include <vector> #include <iostream> using namespace std;
HuffmanTree::HuffmanTree() { weight = NULL; len = 0; headNode = new HuffmanNode(); }
HuffmanTree::~HuffmanTree() { //dtor delete[] weight; delete headNode; } void HuffmanTree::CreateDate() { len = 6; weight = new int[len];//程序在开始时,weight指向不确定位置 //直到CreateDate运行完成,将所有数据存在连续堆中,然后将weight指向这片区域。 weight[0] = 10; weight[1] = 5; weight[2] = 7; weight[3] = 8; weight[4] = 9; weight[5] = 19; } void HuffmanTree::CreateTree() { int temp; //从小到大排序 for(int i=0; i<len; i++) { for(int j=i; j<len; j++) { if(weight[j] < weight[i]) { temp = weight[i]; weight[i] = weight[j]; weight[j] = temp; } } }
vector<HuffmanNode> huffNode; for(int i=0; i<len; i++) { HuffmanNode node(weight[i]); huffNode.push_back(node); } int pos = 0; //记录开始比较的节点位置 //最小权重两点合一 while((huffNode.size()-pos)>2) { //获得两个最小权重和 HuffmanNode* node1 = &(huffNode.at(0+pos)); HuffmanNode* node2 = &(huffNode.at(1+pos)); int sum = node1->GetWeight()+node2->GetWeight(); HuffmanNode* node = new HuffmanNode(sum); //此处node怎么处理析构,程序完了怎么释放?见下。
node1->SetCode(0); node2->SetCode(1); node->leftNode = node1; node->rightNode = node2; node1->parentNode = node; node2->parentNode = node;
pos = pos + 2; //将和的节点插入vector for(vector<HuffmanNode>::iterator it=(huffNode.begin()+pos) ; it != huffNode.end(); it++) { HuffmanNode tempNode = *it; if(sum > tempNode.GetWeight()) { if(it == (huffNode.end()-1)) { huffNode.push_back(*node); delete node;//将上边使用的node释放 break; } } else { huffNode.insert(it,*node);//插入节点 break; } } //显示vector中的节点 /* for(vector<HuffmanNode>::iterator it=(huffNode.begin()) ; it != huffNode.end(); it++) { HuffmanNode tempNode = *it; cout<<tempNode.GetWeight()<<" "; }*/ } //连接头节点 HuffmanNode* node1 = &(huffNode.at(0+pos)); HuffmanNode* node2 = &(huffNode.at(1+pos)); int sum = node1->GetWeight()+node2->GetWeight(); headNode->SetWeight(sum); node1->SetCode(0); node2->SetCode(1);
headNode->leftNode = node1; headNode->rightNode = node2; node1->parentNode = headNode; node2->parentNode = headNode; }
void HuffmanTree::PreOrderVisit(HuffmanNode* node) { if(node != headNode) { node->Display(); } if(node->leftNode != NULL || node->rightNode != NULL) { PreOrderVisit(node->leftNode); PreOrderVisit(node->rightNode); } }
#include <iostream> #include "./include/HuffmanTree.h" using namespace std;
int main() { HuffmanTree huffman; huffman.CreateDate(); huffman.CreateTree(); huffman.PreOrderVisit(huffman.headNode); return 0; }
感觉有点乱,哪位大侠写了huffma,而且比较强大的,分享分享!
赫夫曼树
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
七 赫夫曼树
七 赫夫曼树
赫夫曼编码 数据压缩 原理分析 解压文件 码表 -
赫夫曼树图解
赫夫曼树图解
二叉树 赫夫曼树 图解 -
赫夫曼树---Java版
赫夫曼树一、基本介绍给定 n 个权值作为 n 个叶子结点,构造一棵二叉树,若该树的带
数据结构 java 二叉树 结点 权值 -
赫夫曼树及其应用
前言:最基本的压缩编码方法——赫夫曼(huffman)编码。在了解赫夫曼编码之前,我们必须了解一下赫夫曼树,赫夫的连接数。数的路径长度.
数据结构 霍夫曼树 结点 权值 二叉树