四元Huffman编码
(2013-01-11 23:49:05)
标签:
信息论霍夫曼杂谈 |
分类: 信息论 |
一.问题描述
随意输入一些字符串,统计每一个输入字符出现的个数,然后以它们作为权值,设计一
个四元Huffman编/译码系统。
二.基本要求
(1)统计输入的字符串含有几个字符,即是计算出需多少个码元。
(2)调整码元的个数,以达到可以建立Huffman树。
(3)输出字符串中符号(码元)的个数。
(4)以每个字符出现的次数为权值,建立Huffman树,求出Huffman码。
(5)计算出编码的效率。
(6)对输入字符串进行译码。
三.测试数据
测试数据:abcd;
abbccddw; aadasdweqweqedsg
,
四.算法思想
构造哈夫曼树算法:
(1)用给定的一组权值{W1,W2,…,Wn},生成一个有n棵树组成的森林F={T1,T2,…Tn},
其中每棵树Ti只有一个结点,即权值为 Wi的根结点(也是叶子结点);
(2)从F中选择四个根结点权值最小的树,作为新树根的四个孩子,新树根的权值是四个孩 子根结点的权值之和;
(3)从F中删除这四棵树,另将新的四树加入F中;
(4)重复(2)和(3),直到F中只包含一棵树为止。
编码
该函数实现对哈夫曼树的编码,先申请一个能存储字符编码的临时空间cd,编码从哈夫曼树的叶子结点开始,寻找其父母结点,然后根据父母结点判断孩子结点的位置,1的置0,2的置1,3的置2,4的置3,并将0,1,2,3这样的字符从后往前逆序存放在cd中,每求得一个叶子结点的编码,就将其复制到存储哈夫曼编码的头指正数组中,找完叶子结点的编码后就释放临时空间cd。
对哈夫曼码译码
逐个读取存放在里边的编码字符,并与先前的编码相匹配,直到找到编码对应的原字符。
五.模块划分
功能函数模块划分
void main()
//主函数
count(char *inp_str,int count_str[],char sa_str[])
//统计输入的字符和字符串
select(HuffmanTree HT,int k,int &s1,int &s2,int &s3,int &s4) //挑选权值最小的的四个节点
creat_HuffmanTree(HuffmanTree &HT,HuffmanCode &HC,int count_str[],char sa_str[])//建立霍夫曼树
HuffmanEncoding(HuffmanTree HT,HuffmanCode HC)//给霍夫曼树的每个叶子节点分配二进制码
coding(HuffmanCode HC,char inp_str[],char get[])
//输出字符串的二进制编码
decode(HuffmanCode HC,char receive[],char s[]) //译码
code_ratio(char inp_str[],int count_str[],HuffmanCode HC) //计算编码效率
六.源程序
#include
#include
#include
using namespace std;
#define n 100
//设定输入最大的码元
#define m 133
//在码元最大时,霍夫曼树的节点
int ad_num=0;
//不平衡霍夫曼树时,调整的增加的个数
int tot_num=0;
随意输入一些字符串,统计每一个输入字符出现的个数,然后以它们作为权值,设计一
个四元Huffman编/译码系统。
二.基本要求
(1)统计输入的字符串含有几个字符,即是计算出需多少个码元。
(2)调整码元的个数,以达到可以建立Huffman树。
(3)输出字符串中符号(码元)的个数。
(4)以每个字符出现的次数为权值,建立Huffman树,求出Huffman码。
(5)计算出编码的效率。
(6)对输入字符串进行译码。
三.测试数据
,
四.算法思想
构造哈夫曼树算法:
(1)用给定的一组权值{W1,W2,…,Wn},生成一个有n棵树组成的森林F={T1,T2,…Tn},
(2)从F中选择四个根结点权值最小的树,作为新树根的四个孩子,新树根的权值是四个孩 子根结点的权值之和;
(3)从F中删除这四棵树,另将新的四树加入F中;
(4)重复(2)和(3),直到F中只包含一棵树为止。
编码
对哈夫曼码译码
五.模块划分
功能函数模块划分
void main()
count(char *inp_str,int count_str[],char sa_str[])
select(HuffmanTree HT,int k,int &s1,int &s2,int &s3,int &s4)
creat_HuffmanTree(HuffmanTree &HT,HuffmanCode &HC,int count_str[],char sa_str[])//建立霍夫曼树
HuffmanEncoding(HuffmanTree HT,HuffmanCode HC)//给霍夫曼树的每个叶子节点分配二进制码
coding(HuffmanCode HC,char inp_str[],char get[])
decode(HuffmanCode HC,char receive[],char s[])
code_ratio(char inp_str[],int count_str[],HuffmanCode HC)
六.源程序
#include
#include
#include
using namespace std;
#define n 100
#define m 133
int ad_num=0;
int tot_num=0;