哈夫曼树解压与压缩.pdfVIP

  • 2
  • 0
  • 约2.09万字
  • 约 13页
  • 2020-08-15 发布于广东
  • 举报
哈夫曼树的压缩与解压 1. 算法简要描述 1.哈夫曼算法 1. 哈弗曼算法是根据给定的n 个权值{w1,w2 ,w3wn} ,构造由n 棵二 叉树构成的深林F={T1,T2, 。。。。Tn} ,其中每个二叉树Ti 分别都是只含 有一个权值wi 的根结点,其左右子树为空(i=1 ,,,,,,2 )。 2. 在深林 F 中选取其根结点的权值最小的两棵二叉树,分别作其左右子树 构造一颗新的二叉树,并置这棵新的二叉树根结点的权值为其左右子树 的根结点之和。 3. 从F 中删去这两棵二叉树,同时刚新生成的二叉树加入到深林F 中。 4. 重复2,3,步骤,直至深林F 中只含有一颗二叉树为止。 2.哈夫曼树的实现 函数String EnCode(Char Type ch):表示哈夫曼树已存在,返回字符ch 的编 码。 函数LinkListCharTypeUnCode(String strCode) :表示对哈夫曼树进行译码, 返回编码前的字符序列。根据算法可以看出,在具有n 个结点权值的哈夫曼树的 构造过程中 ,每次都是从F 中删去两棵树,增加一棵树,即每次结束后减少一 棵树,经过n-1 次处理后,F 中就只剩下一棵树了。另外,每次合并都要产生一 个新的结点,合并n-1 次后共产生了n-1 个新结点,并且这n-1 个新节点都是具 有左右子树的分支结点。则最终得到的哈夫曼树中共有 2n-1 个结点,并且其中 没有度为1 的分支结点,最后一次产生的新结点就是哈夫曼树的根结点。 源代码中创建了一个哈夫曼树结点类,其中有数据成员 weight ,parent , leftChild ,rightChild 分别代表了权值,双亲,左孩子,右孩子。 在哈夫曼树类中有数据成员*nodes,*LeafChars,*LeafCharCodes,curPos, num ,分别用来存储结点信息,叶结点字符信息,叶结点字符编码信息,译码时 从根结点到叶结点路径的当前结点,叶结点个数。哈夫曼树类中含有多个函数, 有构造函数,析构函数等。由函数HuffmanTree(CharType ch[],WeightType w[],int n)来构造由字符,权值,和字符个数构造哈夫曼树,在根据哈夫曼算法很容易实 现哈夫曼类的函数以及构造函数。在在算法中,求叶结点字符的编码时,需要从 叶结点出发走一条从高叶结点到根结点的路径,而编码却是从根结点出发到叶结 点的路径,由左分支为编码0 ,右分支为编码1,得到的编码,因此从叶结点出 发到根结点的路径得到的编码是实际编码的逆序,并且编码长度不确定,又由于 可以再线性链表中构造串,因此将编码的信息储存在一个线性立案标准,每得到 一位编码都将其插入在线性链表的最前面。 在求某个字符的编码是由函数EnCode(CharType ch)来求,返回字符编码。在进行 译码时,用一个线性链表存储字符序列,由函数Decode(String strCode)来求,对 编码串strCode进行译码,返回编码前的字符序列。函数Compress()用哈夫曼编 码压缩文件。函数Decompress()解压缩用哈夫曼编码压缩的文件。 在主函数中有两个选项,一个是选择编码压缩,一个是解压。在函数中使用 了文件输入输出流,我们可以选择要压缩的文件名输入,在选出压缩文件保存的 1 地方和文件类型,将压缩所得到的文件存储在另一个文件中,解压也是如此。 2. 源代码 #ifndef __HUFFMAN_TREE_NODE_H__ #define __HUFFMAN_TREE_NODE_H__ // 哈夫曼树结点类模板 template class WeightType struct HuffmanTreeNode { WeightType weight; // 权数据域 unsigned int parent, leftChild, rightChild; // 双亲,左右孩子域 HuffmanTreeNode(); // 无参数的构造函数模板 HuffmanTreeNode(WeightType w, in

文档评论(0)

1亿VIP精品文档

相关文档