哈夫曼树哈夫曼树.docVIP

  • 41
  • 0
  • 约5.92千字
  • 约 9页
  • 2018-04-12 发布于贵州
  • 举报
哈夫曼树哈夫曼树

数据结构实验报告 实验名称: 实验三——哈夫曼树 学生姓名: 吴淳 班 级: 2011211106班 班内序号: 27 学 号: 2011210180 日 期: 2012年11月29日 实验要求 一、实验目的: 掌握二叉树基本操作的实现方法; 了解哈夫曼树的思想和相关概念; 培养使用二叉树解决实际问题的能力。 二、实验内容: 利用二叉树结构实现哈夫曼编/解码器 1.初始化(Init):能够对输入的任意长度的字符串s进行统计,统计每个字符的频度,并建立哈夫曼树。 2.建立编码表(CreatTable):利用已经建好的哈夫曼树进行编码,并将每个字符的编码输出。 3.编码(Encoding):根据编码表对输入的字符串进行编码,并将编码后的字符串输出。 4.译码(Decoding):利用已经建好的哈夫曼树对编码后的字符串进行译码,并输出译码结果。 5.打印(Print):以直观的方式打印哈夫曼树(选作)。 6.计算输入的字符串编码前和编码后的长度,并进行分析,讨论哈夫曼编码的压缩效果。 测试数据如下: I love data structure.I love computer.I will try my best to study data structure. 7.用户界面可以设计成“菜单”方式,能进行交互,根据输入的字符串中每个字符出现的次数统计频度,对没有出现的字符一律不用编码。 2. 程序分析 2.1存储结构 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。且哈夫曼树是一棵只有度为0和2的结点的正则二叉树。一棵有n个叶子的哈夫曼树共有2n-1个结点,可以用一个大小为2n-1的一位数组存放哈夫曼树的各个结点。由于每个结点同时还包含其双亲信息和孩子结点的信息,所以可以使用一个静态三叉链表来存储哈夫曼树。 class Huffman { private: HNode*HTree;//哈夫曼树 HCode*HcodeTable;//编码表 public: void Init(int a[],int n);//初始化, void CreatTable(char character[],int n);//创立编码表 void Encoding(char*s,int n);//编码 int Decoding(char*s,int n);//解码 void Selectmin(HNode*hTree,int n,int i1,int i2);//挑出最小的 }; 二叉树是由一个根结点和两棵互不相交的左右子树构成: 【图一】正则二叉树的结构图 静态三叉链表C++描述如下: struct HNode { int weight; //结点权值 int parent; //双亲指针 int lchild; //左孩子指针 int rchild; //右孩子指针 }; 示意图1: 【图二】示意图1 编码表的结点结构: struct HCode { char data; //编码表中的字符 char code[100]; //该字符对应的编码 }; 示意图2: 【图三】示意图2 2.2关键算法分析 一.关键算法: (1).初始化函数(void Huffman::Init(int weight[],int n)) 算法伪代码: 1. 创建一个长度为2n-1的三叉链表; 2.获得输入字符串的第一个字符,并赋予其相应权值,同时将其双亲、左孩子、右孩子值赋为-1; 3.重复上一步; 4.合成哈夫曼树:i=n;Selectmin(HTree,i,x,y);合成HTree[x]和 HTree[x]。 5. 若满足i2*n-1,重复上一步,每次i++。 (2).创建编码表void Huffman::CreatTable(char character[],int n) 算法伪代码: 1.初始化编码表 2.i=0;HcodeTable[i].data=character[i];child=i;parent=HTree[i].parent;k=0; . 3 .如果parent!=-1; 3.1如果当前结点是其双亲的左孩子,则其对应的编码为0,否则为1; 3.2.k++; 3.3 将当前结点的parent值赋给child值,child的parent值赋给parent值; 3.4重复上面三步; 4.若in

文档评论(0)

1亿VIP精品文档

相关文档