哈夫曼树解压与压缩.pdf
《哈夫曼树解压与压缩.pdf》由会员分享,可在线阅读,更多相关《哈夫曼树解压与压缩.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、哈夫曼树解压与压缩哈夫曼树的压缩与解压1.算法简要描述1、哈夫曼算法1.哈弗曼算法就是根据给定的n 个权值 w1,w2,w3、wn,构造由 n 棵二叉树构成的深林F=T1,T2,。Tn,其中每个二叉树 Ti 分别都就是只含有一个权值 wi 的根结点,其左右子树为空(i=1,2)。2.在深林 F 中选取其根结点的权值最小的两棵二叉树,分别作其左右子树构造一颗新的二叉树,并置这棵新的二叉树根结点的权值为其左右子树的根结点之与。3.从 F 中删去这两棵二叉树,同时刚新生成的二叉树加入到深林F 中。4.重复 2,3,步骤,直至深林 F 中只含有一颗二叉树为止。2、哈夫曼树的实现函数 String En
2、Code(Char Type ch):表示哈夫曼树已存在,返回字符 ch的编码。函数 LinkListUnCode(String strCode):表示对哈夫曼树进行译码,返回编码前的字符序列。根据算法可以瞧出,在具有 n 个结点权值的哈夫曼树的构造过程中,每次都就是从 F 中删去两棵树,增加一棵树,即每次结束后减少一棵树,经过 n-1 次处理后,F 中就只剩下一棵树了。另外,每次合并都要产生一个新的结点,合并 n-1次后共产生了 n-1个新结点,并且这 n-1个新节点都就是具有左右子树的分支结点。则最终得到的哈夫曼树中共有2n-1 个结点,并且其中没有度为1 的分支结点,最后一次产生的新结点
3、就就是哈夫曼树的根结点。源 代 码 中 创 建 了 一 个 哈 夫 曼 树 结 点 类,其 中 有 数 据 成 员weight,parent,leftChild,rightChild 分别代表了权值,双亲,左孩子,右孩子。在哈夫曼树类中有数据成员*nodes,*LeafChars,*LeafCharCodes,curPos,num,分别用来存储结点信息,叶结点字符信息,叶结点字符编码信息,译码时从根结点到叶结点路径的当前结点,叶结点个数。哈夫曼树类中含有多个函数,有构造函数,析构函数等。由函数HuffmanTree(CharType ch,WeightType w,int n)来构造由字符,权
4、值,与字符个数构造哈夫曼树,在根据哈夫曼算法很容易实现哈夫曼类的函数以及构造函数。在在算法中,求叶结点字符的编码时,需要从叶结点出发走一条从高叶结点到根结点的路径,而编码却就是从根结点出发到叶结点的路径,由左分支为编码 0,右分支为编码1,得到的编码,因此从叶结点出发到根结点的路径得到的编码就是实际编码的逆序,并且编码长度不确定,又由于可以再线性链表中构造串,因此将编码的信息储存在一个线性立案标准,每得到一位编码都将其插入在线性链表的最前面。在求某个字符的编码就是由函数EnCode(CharType ch)来求,返回字符编码。在进行译码时,用一个线性链表存储字符序列,由函数 Decode(St
5、ring strCode)来求,对编码串strCode进行译码,返回编码前的字符序列。函数Compress()用哈夫曼编码压缩文件。函数 Decompress()解压缩用哈夫曼编码压缩的文件。在主函数中有两个选项,一个就是选择编码压缩,一个就是解压。在函数中使用了文件输入输出流,我们可以选择要压缩的文件名输入,在选出压缩文件保存的地方与文件类型,将压缩所得到的文件存储在另一个文件中,解压也就是如此。哈夫曼树解压与压缩2.源代码#ifndef _HUFFMAN_TREE_NODE_H_#define _HUFFMAN_TREE_NODE_H_/哈夫曼树结点类模板template struct H
6、uffmanTreeNode WeightType weight;/权数据域unsignedint parent,leftChild,rightChild;/双亲,左右孩子域HuffmanTreeNode();/无参数的构造函数模板HuffmanTreeNode(WeightType w,int p=0,int lChild=0,int rChild=0);/已知权,双亲及左右孩子构造结构;/哈夫曼树结点类模板的实现部分template HuffmanTreeNode:HuffmanTreeNode()/操作结果:构造空结点 parent=leftChild=rightChild=0;temp
7、late HuffmanTreeNode:HuffmanTreeNode(WeightType w,int p,int lChild,int rChild)/操作结果:构造一个权为 w,双亲为 p,左孩子为 lChild,右孩子为 rChild 的结点 weight=w;/权parent=p;/双亲leftChild=lChild;/左孩子rightChild=rChild;/右孩子#endif#ifndef _HUFFMAN_TREE_H_#define _HUFFMAN_TREE_H_#includestring、h/串类#includehuffman_tree_node、h/哈夫曼树结点
8、类模板/哈夫曼树类模板template class HuffmanTree protected:HuffmanTreeNode*nodes;/存储结点信息,nodes0未用CharType*LeafChars;/叶结点字符信息,LeafChars0未用String*LeafCharCodes;/叶结点字符编码信息,LeafCharCodes0未用int curPos;/译码时从根结点到叶结点路径的当前结点int num;/叶结点个数文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7
9、O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码
10、:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8
11、H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J
12、6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E
13、2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10
14、B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2
15、I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1哈夫曼树解压与压缩/辅助函数模板:void Select(int cur,int&r1,int&r2);/nodes1 cur中选择双亲为,权值最小的两个结点 r1,r2 void CreatHuffmanTree(CharType ch,WeightType w,int n);/由字符,权值与字符个数构造哈夫曼树public:/
16、哈夫曼树方法声明及重载编译系统默认方法声明:HuffmanTree(CharType ch,WeightType w,int n);/由字符,权值与字符个数构造哈夫曼树virtual HuffmanTree();/析构函数模板String Encode(CharType ch);/编码LinkList Decode(String strCode);/译码HuffmanTree(const HuffmanTree©);/复制构造函数模板HuffmanTree&operator=(const HuffmanTree©);/重载赋值运算符;/孩子兄弟表示哈夫曼树类模板的实现部分tem
17、plate void HuffmanTree:Select(int cur,int&r1,int&r2)/操作结果:nodes1 cur中选择双亲为,权值最小的两个结点r1,r2 r1=r2=0;/0 表示空结点for (int pos=1;pos=cur;pos+)/查找树值最小的两个结点if (nodespos、parent!=0)continue;/只处理双亲不为的结点if (r1=0)r1=pos;/r1为空,将pos赋值给 r1 elseif (r2=0)r2=pos;/r2为空,将pos赋值给 r2 elseif(nodespos、weight nodesr1、weight)r1=
18、pos;/nodespos权值比 nodesr1更小,将pos赋为 r1 elseif (nodespos、weight nodesr2、weight)r2=pos;/nodespos权值比 nodesr2更小,将pos赋为 r2 template void HuffmanTree:CreatHuffmanTree(CharType ch,WeightType w,int n)文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M
19、10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 Z
20、M2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9
21、P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档
22、编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6
23、U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S1
24、0J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM
25、6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1文档编码:CS6U8H5S10J6 HM6E2X2M10B1 ZM2I5P9P7O1哈夫曼树解压与压缩/操作结果:由字符,权值与字符个数构造哈夫曼树 num=n;/叶结点个数int m=2*n-1;/结点个数nodes=new HuffmanTreeNodem+1;/nodes0未用LeafChars=new CharTypen+1;/LeafChars0未用LeafCharCodes=new Stringn+1;/LeafCharCodes0未用int pos;/临
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 哈夫曼树 解压 压缩
限制150内