实验三、哈夫曼编码
一、实验内容
输入一段文本,计算其中每一个字符的哈夫曼编码,输出编码后文本的长度。
哈夫曼编码作为一种变长编码方式,在文件/图像压缩领域有着重要的应用。
二、设计思路
给定n个树叶的权值,改造带权路径总长最短的最优二叉树的算法由哈夫曼给出。
a. 对个权值进行排序,满足
b. 计算作为中间节点的权,的左儿子是,右儿子是. 在权序列中删除, 加入. 若, 结束,否则转a.
树的一个节点用一个结构体表示,结构体的指针域两个指针分别指向该节点的左儿子和右儿子。如此按哈夫曼算法可以构造哈夫曼树。
考虑到本题并未要求给出每个字符的哈夫曼编码,而仅要求计算字符串的哈夫曼编码总长度,故可以略去建树过程,用n个树叶构成的数组模拟建树过程中节点的合并过程。
另外注意到一个树叶节点在最终构建的哈夫曼树中的深度为h, 则该节点的权值在建树过程中(父节点的权值=左儿子节点的权值+右儿子节点的权值)就会被累加h次。因此在建树过程中每次两个子节点合并成父节点时将父节点的权值进行累加,建树完成后就能得到字符串的哈夫曼编码总长度。这样做可以省去建树完成后遍历整棵