huffman编码怎样计算? 最好是有一个实例.
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/29 06:40:15
huffman编码怎样计算? 最好是有一个实例.
huffman编码怎样计算? 最好是有一个实例.
huffman编码怎样计算? 最好是有一个实例.
为了便于说明,我们先进行一些定义.
原始数据:需要被压缩的数据
压缩数据:被压缩过的数据
n:字母表的长度
a〔,j〕:字母表中第j个字符
t:已处理的原始数据中字符的总个数
k:已处理数据中各不相同字符的个数
显然1j,kn
在压缩开始前,需要引进一个空叶结点,它的重量值始终为0.在以后的压缩和解压过程中,如果k<n,我们用它来表示n-k个字母表中还未出现的字符.初始化的哈夫曼树中只有一个根结点和空叶结点.
压缩子程序读进一个字符后,它将该字符加到根结点的右分枝上,而空叶结点仍留在左分枝上,然后将该字符以ASCII码方式输出.解压子程序对其哈夫曼树作同样的调整.
以后每读进一个字符a〔,it〕,压缩子程序都执行以下的步骤:首先它检查a〔,it〕是否出现在编码树中,如果是,压缩子程序就以静态哈夫曼编码中相同的方式对a〔,it〕进行编码;如果a〔,it〕不在编码树中,压缩子程序首先对空叶结点进行编码,然后将a〔,it〕以ASCII码方式输出,最后在编码树中增加两个结点:在空叶结点的右分枝上加入一个新结点,并将a〔,it〕放在里面,然后在其左分枝上加入一个新的空叶结点.
解压子程序对解压树也做同样的调整,因为它和压缩子程序具有相同的哈夫曼树.当它遍历到空叶结点时,解压子程序就从压缩数据中取出一个ASCII字符,然后对解压树做与压缩子程序相同的调整.
每处理一个字符,压缩和解压程序都需要修改各自的哈夫曼树,为了修改的方便,树中每个结点都具有一个序号,它是根据结点的重量由大到小排列而确定的一个递减序列.
对于图1中的例子,现在已处理了32个字符,即t=32,a〔,it+1〕=“b”,此时并不是简单地将叶结点a〔,it+1〕和它的祖先结点的重量加1,因为这样做之后,该树就不再是哈夫曼树,且各结点的序号也不再是按结点重量由大到小排列而确定的递减序列,结点4和结点6的重量为6,而结点5的重量为5.
动态哈夫曼编码技术的关键就是如何将前t个字符的哈夫曼树调整成一棵前t+1个字符的哈夫曼树.为了解决上述问题,我们分两步来进行.第一步我们把前t个字符的哈夫曼树转换成它的另一种形式,在该树中只需在第二步中简单地把由根到叶结点a〔,it+1〕路径上的所有结点重量加1,就可以变成前t+1个字符的哈夫曼树.其过程就是以叶结点a〔,it+1〕为初始的当前结点,重复地将当前结点与具有同样重量的序号最大的结点进行交换,并使得后者的父结点成为新的当前结点,直到遇到根结点为止.