哈夫曼编码的思想(思路)

写的比较乱(哈哈),但是理解起来应该还好大笑

//哈夫曼构建

#define n 50 //叶子节点个数
//哈夫曼重点在于它是用数组存储结构的,也是用数组序列化(构建)的
//它需要一个指明节点权值数组和节点自身字符数组的就可以了
//然后通过哈夫曼规则构建有父节点和左右孩子节点的结构体数组,这就是哈夫曼
//所以就没有用到链表指针
typedef struct node
{
    char ch;//节点字符,对于非叶子节点,此域不用
    int weight;//权值
    int parent;//父节点下标
    int lchild,rchild;//左右孩子下标
}HuffmanTree[2*n];

//1.对于Huffman这个数组,(0不用)前n项是叶子节点,后面n-1是非叶子节点
//2.所以首先是要初始化前n项叶子节点(也可以称为树)(主要初始化权值 weight 和其自身字符 ch,parent 和 child节点指向0 )
//3.其次初始化后n-1项非叶子节点(parent 和 child节点指向0)
//4.然后用这些叶子节点初始化后面的非叶子节点(如果设当前非叶子节点的下标为i,那么可以从0到i-1范围内循寻找最小权值的两个节点(访问过的节点可以用标志位标记为1),所以找到的条件是找到的两个节点是在前面节点中最小的且没有被标记的)
//5.初始化非叶子节点过程中,对于叶子节点要指明其父亲节点下标,对于非叶子节点要指明其左右孩子下标还有其权值是两个孩子权值之和

//哈夫曼的编码
typedef char* HuffmanCode[n+1]
//从其定义可知哈夫曼编码是一个字符指针数组,数组中的每个成员便是每个节点的编码了,
//由于它是变长的,所以设其为指针变量
//由哈夫曼自身规律可知编码的最大长度为n-1,即非叶子节点个数
//我们容易想到求各个叶子节点的编码可以逆推,从叶子节点一直推到根节点即可(编码可规定为:左孩子为0,右孩子为1)
//因为我们的叶子节点是存储在前n项数组中的,所以遍历前n项即可
//遍历也很简单,首先对于当前节点i我们要取出其父节点f,(在哈夫曼树中只有根节点没有父节点,只有叶子节点没有孩子),所以只要夫节点
//为空说明一个节点编码完成),然后就判断啊,f节点的做孩子是i的话就编码置为0,如果不是就置为1
//因为是逆推,所以字符指针可以分配一块有n个单位的地址,然后逆向赋值,这就ok了。




阅读更多
个人分类: 数据结构
想对作者说点什么? 我来说一句

算法导论 哈夫曼编码

1

niewei1986 niewei1986

2017-06-09 11:36:12

阅读数:230

哈夫曼编码压缩程序(Java)

2016年12月18日 1.44MB 下载

没有更多推荐了,返回首页

不良信息举报

哈夫曼编码的思想(思路)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭