赫夫曼树

赫夫曼编码主要用于数据压缩(无损压缩)

什么是赫夫曼树?

树结点间的连线相关的数叫做权

结点的路径长度:从根结点到该结点的路径上的连接数

树的路径长度:树中每个叶子结点的路径长度之和

结点带权路径长度:结点的路径长度与结点的权值的乘积

树的带权路径长度:WPL(Weight Path Length)是树中所有叶子结点的带权路径长度之和

WPL的值越小,说明构造出来的二叉树的性能越优

最优赫夫曼树的构造方法:

1、拥有一个森林

2、在森林中选出两棵根结点的权值最小的二叉树

3、合并两棵选出的二叉树,增加一个新结点作为二叉树的根,权值为左右孩子的权值之和(权值小的在左、大的在右)

4、在森林中再选择一个权值较小的结点,与刚刚产生的新结点在同一层,如果权值小于产生的新结点的权值则在新结点左侧;否则,在新结点右侧。

赫夫曼编码

赫夫曼编码可以有效压缩数据,一般可以节省20% —— 90%的空间(具体压缩率与数据特性有关)

定长编码:ASCII编码(用8位表示一个字符)

变长编码:单个编码的长度不一致,可以根据整体出现频率来调节

前缀吗:没有任何码字是其它码字的前缀

创建赫夫曼编码需要的工作:

1、建立一个有优先级的队列

2、建立一棵赫夫曼树

3、建立一个赫夫曼表

赫夫曼编码规定左子树全用0表示,右子树全用1表示


赫夫曼编码C语言实现

#include<stdio.h>

#include<stlib.h>

#include“huffmsn.h”

intmain(void)

{

htTree *codeTree = buildTree(“ I loveFishC.com!”);

hltable *codeTable =buildTable(codeTree);

encode(codeTable, “I love FishC.com!”);

decode(codeTree, 0011111000111”);

return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值