在电报通讯中,电文是以二进制的0、1序列传送的。字符集中的字符的使用频率是不同的(比如e和t的使用较之q和z要频繁得多),哈夫曼编码可以使得编码的总长最短,从而相同的位长可以传送更多的信息。
本程序以下面的字符及使用频率为例:
字符 | 权值 |
a | 0.12 |
b | 0.40 |
c | 0.15 |
d | 0.08 |
e | 0.25 |
首先建立哈夫曼树:
i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
tree[i].ch | a | b | c | d | e | | | | |
tree[i].weight | 0.12 | 0.40 | 0.15 | 0.08 | 0.25 | 0.20 | 0.35 | 0.60 | 1.00 |
tree[i].parent | 5 | 8 | 6 | 5 | 7 | 6 | 7 | 8 | 0 |
tree[i].lchild | -1 | -1 | -1 | -1 | -1 | 3 | 2 | 4 | 1 |
tree[i].rchild | -1 | -1 | -1 | -1 | -1 | 0 | 5 | 6 | 7 |
得到哈夫曼树和哈夫曼编码如下:
下面是哈夫曼编码的存储结构:
序号 | bits | ch | start | |||
0 | 1 | 1 | 1 | 1 | a | 2 |
1 | | | | 0 | b | 5 |
2 | | 1 | 1 | 0 | c | 3 |
3 | 1 | 1 | 1 | 0 | d | 2 |
4 | | | 1 | 0 | e | 4 |
程序清单如下:
#include
#define n5
#define m(2*n-1)
#define maxval 10000.0
#define maxsize100
typedef struct
{
}hufmtree;
typedef struct
{
}codetype;
void huffman(hufmtree tree[]);//建立哈夫曼树
void huffmancode(codetype code[],hufmtreetree[]);//根据哈夫曼树求出哈夫曼编码
void decode(hufmtree tree[]);//依次读入电文,根据哈夫曼树译码
void main()
{
}
void huffman(hufmtree tree[])//建立哈夫曼树
{
}//huffman
void huffmancode(codetype code[],hufmtreetree[])//根据哈夫曼树求出哈夫曼编码
//codetype code[]为求出的哈夫曼编码
//hufmtree tree[]为已知的哈夫曼树
{
}//huffmancode
void decode(hufmtree tree[])//依次读入电文,根据哈夫曼树译码
{
}//decode
贴出一例运行结果: