一、哈夫曼编码的特性及作用
哈夫曼编码的目的是得到平均长度最短的编码,对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1(也可调换顺序),则从根到每个叶子的通路上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码。哈夫曼编码是前缀编码,因为在所以叶子所构成的二进制串中,任一编码都不是其他编码的前缀,哈夫曼编码是最优前缀编码,使用频度较高的字符对应的编码较短。
利用哈夫曼树可以的到平均长度最短的编码,研究操作码的优化问题主要是为了缩短指令字的长度,减少程序的总长度以及增加指令所能表示的操作信息和地址信息。
二、哈夫曼编码的算法实现
typedef char * HuffmanCode[N+1];//存放哈夫曼编码串的头指针数组
由于每个哈夫曼编码是变长编码,因此使用指针数组存放每个编码串的头指针
void CrtHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n)
//从叶子结点到根,逆向求每个叶子结点对应的哈夫曼编码
{
char *cd;
int i,start,c,p,j,k;
cd=(char *)malloc(n*sizeof(char));//分配求当前编码的工作空间
cd[n-1]=’\0’;//从右向左逐位存放编码,首先存放编码结束符
for(i=1;i<=n;i++) //求n个叶子结点对应的哈夫曼编码
{
start=n-1;//初始化编码起始指针
c=i;
p=ht[i].parent;//从叶子结点开始往上倒推
while(p!=0)
{
–start;
if(ht[p].LChild==c) cd[start]=’0’;
else cd[start]=’1’;
c=p;
p=ht[p].parent;
}
hc[i]=(char *)malloc((n-start)*sizeof(char));//为第i个编码分配空间
k=n-start;
for(j=0;j
哈夫曼编码
最新推荐文章于 2023-08-28 10:01:39 发布