ZKX's LAB

哈夫曼编码 赫夫曼编码最后

2020-10-01知识8

哈夫曼树和哈夫曼编码 http://hi.baidu.com/%B3%CC%D0%F2%D0%A1%B1%F8/blog/category/%CA%FD%BE%DD%BD%E1%B9%B9CHAPTER:4(4_4)*PROGRAM:哈夫曼树*CONTENT:构造哈夫曼树,哈夫曼编码*includeincludeincludeincludeincludetypedef struct{unsigned int weight;结点权值unsigned int parent,lchild,rchild;结点的父指针,左右孩子指针}HTNode,*HuffmanTree;动态分配数组存储哈夫曼树typedef char*HuffmanCode;动态分配数组存储哈夫曼编码表void CreateHuffmanTree(HuffmanTree&,unsigned int*,int);生成一棵哈夫曼树void HuffmanCoding(HuffmanTree,HuffmanCode&,int);对哈夫曼树进行编码void PrintHuffmanCode(HuffmanCode,unsigned int*,int);显示哈夫曼编码void Select(HuffmanTree,int,int&,int&);在数组中寻找权值最小的两个结点void main(){HuffmanTree HT;哈夫曼树HTHuffmanCode HC;哈夫曼编码表HCint n,i;n是哈夫曼树叶子结点数unsigned int*w;w存放叶子结点权值

哈夫曼编码 赫夫曼编码最后

哈夫曼编码 HC是一个字符串数组,HC[i]中保存的是第i字符的编码;n是haffman树的树高HC=(HuffmanCode)malloc((n+1)*sizeof(char*));cd是一个临时变量,临时保存编码cd=(char*)malloc(n*sizeof(char));cd[n-1]='\\0';字符串的结束符为0(0)for(i=1;i;i+){start指向cd中的字符串位置,初始为末字符;(1)start=n-1;对于haffman树的每一个叶子节点c,反向遍历从树根到该叶子节点的路径,左枝则编码为0,右枝编码为1;将编码字符串保存在cd中(2)for(c=i,f=HT[i].parent;f。0;c=f,f=HT[f].parent)(3)if(HT[f].lchild=c)(4)cd[-start]='0';else(5)cd[-start]='1';将cd中的字符串保存在hc[i]中(6)HC[i]=(char*)malloc((n-start)*sizeof(char));strcpy(HC[i],&cd[start]);}释放堆上的内存free(cd);注意,在最后还需要释放HC开辟的内存。举例:设需要编码的字符串为deccaaa则haffman树如下:(n1)\\(n2)a\\(n3)c\\d e则树高为3,n=3;假设第一个for循环中i=0~3 依次表示d,e,c,a执行上面的程序:设i=1;(即计算e的编码,当i为其他时是一样的)执行到(1)行:start=2;cd=\"_\"(用 下划线表示还没有赋值执行到(2):c=i;(即c指向第一个字符d);f=HT[i].parent;即f是d的父节点n3。

哈夫曼编码 赫夫曼编码最后

/*algo6-1.c 求哈夫曼编码。实现算法6.12的程序*/公用的常量和类型-includeincludeincludeinclude函数结果状态代码define TRUE 1define FALSE 0define OK 1define ERROR 0define INFEASIBLE-1define OVERFLOW-2define UINT_MAX 1000typedef int Status;c6-7.h 哈夫曼树和哈夫曼编码的存储表示*/typedef struct HTNode{char leaf;unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;动态分配数组存储哈夫曼编码表*/typedef char*HuffmanCode;动态分配数组存储哈夫曼编码表*/typedef struct Node{char leaf;unsigned int weight;struct Node*next;}LeafNode,*LeafLink;typedef struct{LeafLink head;unsigned len;}LeafLinkList;int min1(HuffmanTree t,int i){/*函数void select()调用*/int j,flag;unsigned int k=UINT_MAX;取k为不小于可能的值*/for(j=1;j;j+)if(t[j].weight[j].parent=0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;}void select(HuffmanTree t,int i,int*s1,int*s2){/*s1为最小的两个值中序号小的那个*/int j;s1=min1(t,i);s2=min1(t,i);if(*s1>;*s2){j=*s1;s1=*s2;s2=j;}}。

哈夫曼编码 赫夫曼编码最后

哈夫曼编码码字的如何确定?我会写编码过程,就是不知道怎么确定码字,书上说是从最后一级开始,向前返回

哈夫曼编码的原理? 霍夫曼(2113Huffman)编码属于码词长度可变的编码类,是霍夫曼5261在1952年提4102出的一种编码方法,即从下到上的编1653码方法。同其他码词长度可变的编码一样,可区别的不同码词的生成是基于不同符号出现的不同概率。生成霍夫曼编码算法基于一种称为“编码树”(coding tree)的技术。算法步骤如下:(1)初始化,根据符号概率的大小按由大到小顺序对符号进行排序。(2)把概率最小的两个符号组成一个新符号(节点),即新符号的概率等于这两个符号概率之和。(3)重复第2步,直到形成一个符号为止(树),其概率最后等于1。(4)从编码树的根开始回溯到原始的符号,并将每一下分枝赋值为1,上分枝赋值为0。以下这个简单例子说明了这一过程。1).字母A,B,C,D,E已被编码,相应的出现概率如下:p(A)=0.16,p(B)=0.51,p(C)=0.09,p(D)=0.13,p(E)=0.112).C和E概率最小,被排在第一棵二叉树中作为树叶。它们的根节点CE的组合概率为0.20。从CE到C的一边被标记为1,从CE到E的一边被标记为0。这种标记是强制性的。所以,不同的哈夫曼编码可能由相同的数据产生。3).各节点相应的概率如下:p(A)=0.16,p(B)=0.51,p(CE)=0.20,p(D)=0.13D和A两个节点的概率最小。这两个节点。

哈夫曼编码 希望这个可以帮到你,我刚做完课程设计,做的就是哈弗曼便译码器,有问题可以问我!初始化函数*函数功能:从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中函数参数:向量HT的前n个分量表示叶子结点,最后一个分量表示根结点,各字符的编码长度不等,所以按实际长度动态分配空间void HuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,int n)/w存放n个字符的权值(均>;0),构造哈夫曼树HT,并求出n个字符的哈弗曼编码HC{if(n)return;m=2*n-1;m为结点数,一棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));0号单元未用初始化哈弗曼树-for(p=HT+1,i=1;i;i+,p+,w+)p={*w,0,0,0,0}for;i;i+,p+)p={0,0,0,0,0}建哈夫曼树-for(i=n+1;i;i+){Select(HT,i-1,s1,s2);在HT[1.i-1]选择parent为0且weight最小的两个结点,其序号分别为s1和s2HT[s1].parent=i;HT[s2].parent=i;HT[i].lchild=s1;HT[i].rchild=s2;左孩子权值小,右孩子权值大HT[i].weight=HT[s1].weight+HT[s2].weight;}从叶子到根逆向求每个字符的哈弗曼编码-HC=(HuffmanCode)malloc(。

哈夫曼编码树怎么解? 那不是log20,是log下标2 0.4=log_2 0.4。最后计算出来的信息熵是平均每个灰度的信息熵。不用哈夫曼编码的话是3bit,用了哈夫曼编码后为2.25bit,也就意味着总体编码长度缩短了

哈夫曼树和哈夫曼编码 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权。

#哈夫曼编码#hc#字符编码

随机阅读

qrcode
访问手机版