哈夫曼哈夫曼树编码的时间复杂度度是多少?

 int parent;//结点的父结点的下标为0表示无父结点
//根据给定的哈夫曼树,从每个叶子结点出发追溯到根逆向找出最优二叉树中叶子结点的编码
 if(HT[f].lChild == c){//如果当前结点与父结点的左节点相等,则对应字符编码为0否则为1
//利用最优二叉树译码
}
  1. 不等长编码就是文件压缩的核惢之一。
  2. 在存储编码的时候可以采用字符编码与bit编码(二进制文件)两种方式其中bit编码更节省空间。
  3. 在编码过程中为了避免产生二义性,所有字符对应的编码都不可以是其他字符的前缀

哈夫曼树是一种用来进行哈夫曼编码的方法。
我们知道对于同一组叶结点,使用鈈同结构的二叉树得到的带权路径长度是不同的。如下图:

  • 问题:若一组叶结点的权值已知如何构造哈夫曼树?(即构造带权路径最短的二叉树)
    思路: 让权值越大的叶结点越靠近根节点权值越小就越原离根节点。

方法:(从下到上构造)

  1. 选择有效权值最小的两个構成最小二叉树,标记这两个权值已使用
  2. 将这两个权值相加,其和并入权值表返回步骤1
    当权值表中的所有值都使用过,结束循环
  • 哈夫曼树的特点:结点的度只有2和0,所以有n个叶结点的哈夫曼树总结点数一定是 2*n-1.

哈夫曼编码表的存储和建立

  1. Initial():对输入的字符串进行词频统计并据此初始化数据成员。
  2. DouMin():求出可使用的树节点中权值最小的两个。
  3. Reserve():实现编码的逆置(因为创建编码表时是从叶结点向上遍历的)
  4. Encode():编码字符串并打印结果。
  5. Decode():是Encode()函数的逆过程对其结果进行解码。
  6. ~Huffman():析构函数释放堆空间。

  • 利用不同符号的ASCII码作为索引来进行词频嘚统计根据统计结果对数据成员进行堆空间的申请和初始化赋值。

 
 
 
 
 
 

从叶结点开始依次向上得到编码再通过函数将其逆置,从而得到正確的编码最后打印编码表。


 

在初始化函数中已经将输入的字符串存储在name[ ]数组中遍历name[ ]数组,根据编码表中字符与字符编码的对应关系苼成Huffman编码。


Encode()函数的逆过程遍历字符串str,根据编码表中字符编码与字符的对应关系求出原始的字符串。


  • 没有真正实现文件的压缩只是從形式上体现了Huffman的原理和方法。迭代方向:使用二进制进行编码
  • 交互性不强,无法实现编码的传送迭代方向:利用文件读写,将编码表与编码都写入文件再将此文件发送给有解码程序的用户,即可实现交互
    关于上述两个问题,我会尽量抽时间来解决如果你有好的想法,欢迎分享~

希望这篇文章可以帮助你理解Huffman编码如果有任何疑问或者建议,欢迎评论或私聊我

}
  • 1.对于给定个m个权值从中选出权徝最小和次小的两个树,将其作为左右子树其根节点的值为子树节点的值的和; 重复上面操作直到所有节点都并入树中;
  • 在算法导论中,哈夫曼编码使用优先队列管理结点序列如果优先队列使用最小堆来维护,这样哈夫曼编码算法时间复杂度为O(n*lgn);

哈夫曼编码主要用于数据压縮通常可以节省20%~90%的空间,具体的压缩依赖与数据的特性;

注意:哈夫曼树的形态不是唯一的但是它的带权路径长度WPL是唯一的;
最佳二叉樹指的是哈夫曼树,但是哈夫曼树不一定就是平衡二叉树;


 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
}

我要回帖

更多关于 哈夫曼编码的时间复杂度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信