哈弗曼编码

基本思想

  • 以字符的使用频率作为权构建一颗哈弗曼树,然后利用哈弗曼树对字符进行编码。
  • 构造一颗哈弗曼树,是将要编码的字符作为叶子节点,该字符在文件中的使用频率作为叶子节点的权值,以自底向上的方式,通过n-1次的‘合并’后构造的一棵树,核心思想是权值越大的叶子离跟很近。

贪心策略

  • 每次从树的集合中取出没有双亲且权值最小的两颗树作为左右子树

算法步骤

  1. 确定合适的数据结构。需要考虑情况有:
    • 哈弗曼树中没有度为一的节点,则一颗有n个叶子节点的哈弗曼树共有2n-1个节点(n-1次的合并,每次产生一个新节点)
    • 构成哈弗曼树后,为求编码,需从叶子节点出发走一条从叶子到根的路径。
    • 译码需要从根出发走一条从根到叶子的路径,那么我们需要知道每个节点顶点权值、双亲、左孩子、右孩子和节点的信息。
  2. 初始化。构造n棵节点为n个字符的单节点树集合T={t1,t2,t3,...,tn},每棵树只有一个带权的根节点,权值为该字符的使用频率。
  3. 如果T中只剩下一棵树,则哈弗曼树构造成功,调到步骤6。否则,从集合T中取出没有双亲且权值最小的两棵树ti和tj,将他们合并成一颗新树Zk,新树的左孩子为ti,右孩子为tj,Zk的权值为ti和tj的和。
  4. 从集合T中删除ti和tj,加入Zk。
  5. 重复步骤3-4。
  6. 约定做分支上的编码为“0”,右分支上的编码为“1”。从叶子节点到根节点逆向求处每个字符的哈弗曼编码,从根节点到叶子节点的路径上的字符组成的字符串为该叶子节点的哈弗曼编码。算法结束

你可能感兴趣的:(哈弗曼编码)