哈夫曼树实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一.需求分析
设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】
(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树; (2)编码:利用建好的哈夫曼树生成哈夫曼编码; (3)输出编码;
(4)设字符集及频度如下表:
字符空格 A B C D E F G H I J K L M
频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 N O P Q R S T U V W X Y Z
频度 57 63 15 1 48 51 80 23 8 18 1 16 1 【选做内容】 (1)译码功能; (2)显示哈夫曼树; (3)界面设计的优化
二、概要设计
1.哈夫曼树的定义:
在一棵二叉树中,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。 2.哈夫曼树的构造:
假设有N个权值,则构造出的哈夫曼树有N个叶子结点。N个权值分别设为W1,W2,……….Wn,则哈夫曼树的构造规则为:
(1)将W1,W2,……….Wn看成有N棵树的森林;
(2)在森林中选出两个根结点的权值最小的树合并,作为一棵新树的
左,右子树,且新树的根结点为其左,右子树结点权值之和;(3)从森林中删除选取取的两面三刀棵树,并将新树加入森林;(4)重复(2)(3)步,直到森林中只剩一棵树为止,该树即为我们
所求得的哈夫曼树。
在构造哈夫曼树的过程中,每次由两棵权值最小的树生成一棵新树时,新树的左子树和右子树可以任意安排,这样将会得到具有不同结构的多个哈夫曼树,但字们都具有相同的带权路径长度。为了歙得到的哈夫曼树的结构尽量唯一,通常规定生成的哈夫曼树中每个结点的左子树根结点的权要小于等于右女树根结点的权
三.详细设计
#include
#include
#include
#include
#define MAXVALUE 10000 /*权值最大值*/
#define MAXLEAF 30 /*叶子最多个数*/
#define MAXNODE MAXLEAF*2-1 /* 结点数的个数*/ #define MAXBIT 50 /*编码的最大位数*/ typedef struct node /*结点类型定义*/
{
char letter;
int weight;
int parent;
int lchild;
int rchild;
}HNodeType;
typedef struct /*编码类型定义*/
{
char letter;
int bit[MAXBIT];
int start;
}HCodeType;
typedef struct /*输入符号的类型*/
{
char s;
int num;
}lable;
void HuffmanTree(HNodeType HuffNode[],int n,lable a[]) {
int i,j,m1,m2,x1,x2,temp1;
char temp2;
for (i=0;i<2*n-1;i++) /*结点初始化*/
{
HuffNode[i].letter=0;
HuffNode[i].weight=0;
HuffNode[i].parent=-1;
HuffNode[i].lchild=-1;
HuffNode[i].rchild=-1;
}
for (i=0;i for (j=i+1;j if (a[j].num>a[i].num) { temp1=a[i].num; a[i].num=a[j].num; a[j].num=temp1; temp2=a[i].s; a[i].s=a[j].s; a[j].s=temp2; } for (i=0;i { HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s; } for (i=0;i { m1=m2=MAXVALUE; x1=x2=0; for (j=0;j { if (HuffNode[j].parent==-1&&HuffNode[j].weight { m2=m1; x2=x1; m1=HuffNode[j].weight; x1=j; } else if (HuffNode[j].parent==-1&&HuffNode[j].weight { m2=HuffNode[j].weight; x2=j; } } HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i; /*权值最小与次小的结点进行组合*/ HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } } void HuffmanCode(int n,lable a[]) { HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p; HuffmanTree(HuffNode,n,a); for (i=0;i { cd.start=n-1; c=i; p=HuffNode[c].parent; while (p!=-1) { if (HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p; p=HuffNode[c].parent; } for (j=cd.start+1;j HuffCode[i].bit[j]=cd.bit[j];