哈夫曼树的应用实例
现代的电脑都是二进制的电脑,所以电脑传输的信息都是以二进制包装的。上面已知哈夫曼树带权结点路径最小的二叉树(即有效节省内存空间和发送效率),那么我们就可以用哈夫曼树存储信息并发送给别人,别人按哈夫曼树构造的原理解码不就好了,因此出现哈夫曼编码,那么就来实践出真理
哈夫曼编码的主要思想
为了使出现较多的字符以较短的编码,出现较短的字符以较短的编码,约定在哈夫曼树中左分支记位1,右分支记为0,从根结点到每个叶子结点路径上的0、1序列即为相应字符的编码
定义
对一棵具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,右分支赋予1,则从根到每个叶子的路径上,各分支的赋值分别构成一个二进制串,该二进制串就称为哈夫曼编码
前缀编码:若在一个编码方案中,任一个编码都不是其他编码的前缀(最左子串,则称为前缀编码。如0,10,110,111是前缀编码,而0,01,010,111就不是。
性质
1).哈夫曼树是前缀编码。因为每个叶子都有自己独有的路径。
2).哈夫曼是最优的前缀编码。
哈夫曼编码的实现
哈夫曼编码树的带权路径长度由于哈夫曼编码是变长编码,因此使用一个指针数组来存放每个字符编码串的首地址。
各自符由哈夫曼编码存储在由HuffmanCode定义的动态分配的数组HC中;
哈夫曼编码表的存储表示如下:
typedef char *HuffmanCode;
为了实现方便,数组的0号单元不使用,从1号单元开始使用,所以数组HC的大小为n+1,即编码表HC包括n+1行。但因为每个字符编码的长度不能事先知道,所以不能不能预先分配好大小,为了不浪费内存空间,动态分配一个长度为n的(字符编码串长度一定小于n)的一维数
组cd,用来临时存放当前正在求解的第i个(1≤i≤n)个字符编码,当第i个字符的编码求解完毕后,根据数组cd的字符串长度分配HC[i]的空间,然后将数组cd中的编码赋值到HC中
简单来说就是,工具cd数组边求解边存放当前的编码字符串,求解完毕后就可放到最终的HC里
因为求解编码时是从哈夫曼树的叶子开始,向上回溯至根结点。所以对于每个字符,得到的编码顺序是从右到左的(即反过来才是真编码)。因此,我们也把数组反着输入到数组里面就变成真编码了(即第一个字符放在cd[n-2]中,cd[n-1]存放’0’空字符以便结束,第二个字符放在cd[n-3],依次类推,直到全部编码完毕。另外还可用栈实现
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论