栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++实现huffmantree编码

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++实现huffmantree编码

目标

已知一组包含至少8个字符的数组及各字符的出现概率。求该字符串数组的哈夫曼编码及平均码长。

1.什么是Huffman编码
例如:c++一个字符是8bit,在传输时就会发送8bit,那么8个字符,就是8*8=64bit。Huffman编码对这些字符进行编码,将8字符变为了26bit,节约了空间
本文主要是代码实现,需要懂原理的建议看其他的博主文章,或则看我代码中的解释
以下是代码:

#include
#include
#include
#include
#include 
using namespace std;
#define CHARNUM 8//表示字符数; 
#define HUFNODE (2*CHARNUM)//用于表示创建humffmantree的节点的多少 
class Node{
	public:
		double weight=-1;
		char c;
		int left=-1;
		int right=-1;
		string code="";
		Node(){}
		Node(double weight,char c){
			(*this).weight=weight;
			(*this).c=c;
		}
};
bool cmp(Node *a,Node *b){
	return a->weightweight;
}
class HumfTree{
	public :
		//创建一个数组,记录数据 
		Node *node[HUFNODE];
		Node *node1[HUFNODE-1];
		HumfTree(){
			
		}
//		初始化humffmantree;
//		对数组进行赋值; 
		void init(){
//			对每个节点进行赋值;
			int arr[CHARNUM];
			double sum=0;
			double weight;
			for(int i=0;iweight+node[pre+1]->weight),'.');
				node[i+CHARNUM]->left=pre;
				node[i+CHARNUM]->right=pre+1;
			}
		}
//		以下两个方法表示进行前序遍历这个树 , 
		void preOrder(){
			selectAndCode(HUFNODE-2,"");
		}
		//遍历方法1.0 
		//这里遍历逻辑树,没有编码 
		void select(int index){
			cout<c<<":"<weight<left!=-1){
				select(node[index]->left);
			}
			if(node[index]->right!=-1){
				select(node[index]->right);
			}
		}
		//遍历方法2.0 
		//这个方法用于前序遍历和编码 
		void selectAndCode(int index,string s){
			cout<c<<":"<weight<c!='.'){
				node[index]->code=s;
			}
			if(node[index]->left!=-1){
				selectAndCode(node[index]->left,s+"0");
			}
			if(node[index]->right!=-1){
				selectAndCode(node[index]->right,s+"1");
			}
		}
		
		//该方法用于展示字符的huffman编码 
		void showCharCode(){
			for(int i=0;ic!='.'){
					cout<c<<":"<code<c<<"权重"<weight<weight;
			} 
			cout<<"和"<c!='.'){
					cout<c<<":"<code<weight;
					int len=node[i]->code.length();
					ans+=w*len;
				}
			}
			
			return ans;
		} 
		
};


int main(){
	//改行代码用于生成随机数,不改变改行代码,生成的随机数不会改变,方便用于测试代码 
//	srand((int)time(0));
	
	HumfTree tree;
	tree.init();
	//显示一下各个数的权重 
	tree.show();
	tree.createTree();
	//前序遍历 
	cout<<"前序遍历"<
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/346983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号