哈夫曼编码实验报告

哈夫曼编码实验报告
哈夫曼编码实验报告

实验1哈夫曼编码实验目的掌握哈夫曼编码原理,掌握哈夫曼树的生成方法。了解数据压缩。实验要求实现哈夫曼编解码生成算法。3、实验内容首先统计要压缩的文件中出现的字符和字母的数量,根据字符字母和空格的概率进行编码,然后读取要编码的文件并存储到另一个文件中;然后调出编码的文件,解码输出,最后存储到另一个文件中。5、实验原理1,哈夫曼树的定义:假设有n个权值,试着构造一个有n个叶子节点的二叉树,每个有权的叶子都是wi,其中权值路径最小的二叉树成为Huffman树或最优二叉树;2、Huffman树的构造:权值为输入频率数组,并且这些值在node对象中按data属性依次分配给HT,即每个HT节点对应一个输入频率。然后,根据数据属性,从最小值到最大值取两个最小值和这个小的HT节点,将它们的数据相加,构造一个新的htnode作为它们的父节点。指针parentleftchild,rightchild被分配了相应的值。将这个新节点插入最小堆。按照这个步骤,我们可以建造一棵树吗?通过构造的树,从下至上,从频率节点开始搜索父节点,直到父节点是树的顶点。这样,每次向上搜索后,根据原始节点是父节点的左子节点还是右子节点来记录1或0。这样,每个频率都有一个唯一对应的01码,任何没有前端的码都和其他完整码一

样。初始化,以文本文件中的字符数为权值,生成Huffman树,按符号概率由大到小对符号进行排序,概率最小的两个符号形成一个节点。重复步骤()(),直到概率和为1,从根节点到每个符号对应的“叶”,概率高的符号标为“0”,概率低的符号从根节点开始,对符号7进行编码。实验程序? include? include? include使用命名空间STD;typedef struct//节点结构{char data;//记录字符值long int weight;//记录字符权重unsigned int parent,lchild,rchild;}Htnode,*HuffmanTree;typedef char**huffmancode;//dynamicly allocate array to store Huffman code table void select(HuffmanTree&HT,int i,int&S1,int&S2)//选择HT[1中权重最小且父节点不为0的两个节点。。。T] ,它们的序列号是S1和S2{S1=0;S2=0;int N1=30000,N2=30000;for(int k=1;k<=I;k++){if(HT[k])。父项==0{if(HT[k])。重量

int*weight;weight=new char[n+1];weight=New Int[n+1];for(I=1;I<=n;I++I++)//将要编码的字符放入Zifu数组,{char ch;ch=ch=fin1.get();Zifu[I]=ch=ch=fin1.get();Zifu[I]=ch;}for (I=1;I<=n;I++)///将编码字符对应的权重放入权重数组{fin2>>weight[I];}for (I=I=I>>weight[I];}{I=n=I=n(I=n=I+);I=n=。数据=Zifu[i];HT[i]。(i=n+1;i<=m;i++++++(i=i=n+1;i<=m;i++){HT[i].数据='@';}为(i=1;i<=m;i++){HT[i].父母=HT[i[i].lchild=HT[i[i].lchild=HT[i].rchild=0;}为(i=n+1;i<=m;m;++i){int s1,s2;选择(HT,i-1,s1,s2)的选择(HT,i-1,s1,s2);HT[s1]父母=i;HT[s2]父母=i[s2]父母=i;H[i[i[i[i]H[i]LCHIL[=s2;HT[i].Weight=HT[s1].Weight+HT[s2].Weight;}HC=(HuffmanCode)malloc((n+1)*sizeof(char*);打开工作区进行编码:char*CD;CD=(char*)malloc(n*sizeof(char));//打开工作区存储权重:CD[n-1]='\0';for(I=1;I<=n;I++){int start=n-1;int c,f;for(c=I,f=HT[I]。家长;F!=0;C=f,f=HT[f]。Parent)//从叶到根的反向编码{if(HT[f[f]lchilld==C)CD[--Start]=<0';;;(I=1;I<=n;I++){int Start=n-1;I=(I=1;I<=n;I++){int Start=n-1;I=n[//如果左键为子级

相关主题
相关文档
最新文档