cV+=INFORMATION[i].PROBABILITY*INFORMATION[i].lengthofhuffmancode*INFORMATION[i].lengthofhuffmancode;
cV-=averageofhuffmancode*averageofhuffmancode;
printf("赫弗曼编码的码方差为:
%lf\n",cV);
}
附页2
#include
#include
#include
#include
#include
#include//为了使用vector容器
usingnamespacestd;///vector属于std命名域,因此使用全局命名域方式
structHuffman_InformationSource//信源类型
{
charInformationSign[10];//信源符号
doubleProbability;//概率
charCode[10];//编码结果
intCodeLength;//码长
};
structHuffNode//赫夫曼树的节点类型
{
charInformationSign[10];
doubleProbability;
HuffNode*LeftSubtree,*middleSubtree,*RightSubtree,*Next;
charCode[10];
intCodeLength;
};
classCHuffman_3//三进制赫夫曼编码
{
public:
CHuffman_3()//初始化
{
ISNumber=0;
AvageCodeLength=0.0;
InformationRate=0.0;
CodeEfficiency=0.0;
}
~CHuffman_3()
{
DestroyBTree(HuffTree);
}
voidHuffman_Input();//输入信息
voidHuffman_Sort();//排序
voidHuffman_Tree();//构造赫夫曼树
voidHuffman_Coding();//生成赫夫曼编码
voidHuffman_CodeAnalyzing();//结果分析
voidHuffman_Display();//显示结果信息
voidDestroyBTree(HuffNode*TreePointer);//释放资源
private:
vectorISarray;//声明ISarray数组,初始时为空
intISNumber;//符号个数
doubleAvageCodeLength;//平均码长
doubleInformationRate;//信息率
doubleCodeEfficiency;//编码效率
HuffNode*HuffTree;//赫夫曼树
private:
voidHuffman_Code(HuffNode*TreePointer);
};
//输入信源信息如果需要添加信源信息在这里修改即可
voidCHuffman_3:
:
Huffman_Input()
{
Huffman_InformationSourcetemp1={"A",0.40,"",0};
ISarray.push_back(temp1);
Huffman_InformationSourcetemp2={"B",0.18,"",0};
ISarray.push_back(temp2);
Huffman_InformationSourcetemp3={"C",0.10,"",0};
ISarray.push_back(temp3);
Huffman_InformationSourcetemp4={"D",0.10,"",0};
ISarray.push_back(temp4);
Huffman_InformationSourcetemp5={"E",0.07,"",0};
ISarray.push_back(temp5);
Huffman_InformationSourcetemp6={"F",0.06,"",0};
ISarray.push_back(temp6);
Huffman_InformationSourcetemp7={"G",0.05,"",0};
ISarray.push_back(temp7);
Huffman_InformationSourcetemp8={"H",0.04,"",0};
ISarray.push_back(temp8);
ISNumber=ISarray.size();
}
//按概率“从大到小”排序:
voidCHuffman_3:
:
Huffman_Sort()
{
Huffman_InformationSourcetemp;
inti,j;
for(i=0;ifor(j=i+1;jif(ISarray[i].Probability{
temp=ISarray[i];
ISarray[i]=ISarray[j];
ISarray[j]=temp;
}
}
//基于ISarray数组构造赫夫曼树
voidCHuffman_3:
:
Huffman_Tree()
{
inti;
HuffNode*ptr1,*ptr2,*ptr3,*ptr4,*temp1,*temp2;
//
(1):
基于数组,创建单向链表
ptr1=newHuffNode;
strcpy(ptr1->InformationSign,ISarray[0].InformationSign);
ptr1->Probability=ISarray[0].Probability;
strcpy(ptr1->Code,ISarray[0].Code);
ptr1->LeftSubtree=NULL;
ptr1->middleSubtree=NULL;
ptr1->RightSubtree=NULL;
ptr1->Next=NULL;
HuffTree=ptr1;//赋给数据成员HuffTree
for(i=1;i{
ptr2=newHuffNode;
strcpy(ptr2->InformationSign,ISarray[i].InformationSign);
ptr2->Probability=ISarray[i].Probability;
strcpy(ptr2->Code,ISarray[i].Code);
ptr2->LeftSubtree=NULL;
ptr2->middleSubtree=NULL;
ptr2->RightSubtree=NULL;
ptr2->Next=ptr1;
ptr1=ptr2;
}
//结果:
链表的表头为数组的最小元素。
HuffTree=ptr1;//使HuffTree指向链表头
//
(2):
基于链表,构造赫夫曼树
intk;//树的层次
ints;//需要添加的无用符号的数目。
k=ceil((double)(ISNumber-3)/(3-1));//“3”:
表示三进制
//ceil函数:
向上取整;
//floor函数:
向下取整
s=3+k*(3-1)-ISNumber;
if(s==1)//第一次取m-s=3-1=2个符号
{
//合并概率最小的二个节点p