⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffman_b.cpp

📁 huffman编码的c++实现源码
💻 CPP
字号:
#include "huffman_b.h"void huffman_b::generate_codes(int num, const unsigned long* weights){	if (num <= 1 || weights == NULL)		throw new huffman_exception("参数非法");	// 权值为0的元素不参与编码,nonzero_num实际参与编码的元素数量	int nonzero_num = 0;		HuffmanTree HT = new HTNode[2*num]; // 0号单元未用	if (HT == NULL) throw new huffman_exception("内存不足");	memset(HT, 0, sizeof(HTNode) * (2*num));	for(int i = 1; i <= num; i++)	{		HT[i].weight = weights[i - 1];		if (weights[i - 1] != 0) 			nonzero_num++;	}			// 建Huffman树	int s1, s2;	for(int i = num + 1; i < num + nonzero_num; ++i) 	{		select(HT, i - 1, s1, s2);		HT[s1].parent = i; HT[s2].parent = i;		HT[i].lchild = s1; HT[i].rchild = s2;		HT[i].weight = HT[s1].weight + HT[s2].weight;	}	// 从叶子到根逆向求每个元素的编码	codes.clear(); code_lens.clear();	for(int i = 1; i <= num; ++i)	{				unsigned long code = 0; unsigned long bit = 1; int code_len = 0, c, f;		for(c = i, f = HT[i].parent; f != 0; c = f, f = HT[f].parent)		{			if (HT[f].rchild == c) 				code |= bit;				bit <<= 1; code_len++;		}		codes.push_back(code);		code_lens.push_back(code_len);	}	delete[] HT;}void huffman_b::select(HuffmanTree tree, int n, int& s1, int& s2){	tree[0].weight = (unsigned long)(-1l); s1 = s2 = 0;	for(int i = 1; i <= n; ++i)		if (tree[i].weight != 0 && tree[i].parent == 0)		{			if (tree[i].weight < tree[s1].weight )			{ s2 = s1; s1 = i;}			else if (tree[i].weight < tree[s2].weight)			{ s2 = i; }		}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -