已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试编写算法求其赫夫曼编码。
这个题目在数据结构中是一个比较经典的例子,刚开始我看到的时候,就有了很大的兴趣,毕竟对未知的事物来说这个是吸引人的,什么是译文,怎么破解以为,为什么只有0 1就能解出很多的说法,这就是赫夫曼编码的重要之处,当然其中也讲了压缩,当然这都是基本的。
赫夫曼树也称为最优的二叉树。也有地方叫哈夫曼树。为什么说是最优,就是因为在计算机中运行的最快,对于上面的题目,首先要创建一个赫夫曼树,对于赫夫曼树,我不说太多,概率我们当作权值,构造出树,对于编码就是赫夫曼的高明之处,将路径上左边改为0,右面改为1,就是我们的编码啦,当然我们要从叶子找到根,代码给出,说的不明白,希望代码给你一些不同的看法。
main.cpp:
#include <iostream>
#include "han.h"
#include "Status.h"
using namespace std;
int main()
{
HuffmanTree H;
int n;
n = 8;
createmanTree(H,n);
bianma(H,n);
return 0;
}
han.h:
#include<iostream>
#include<string>
using namespace std;
typedef struct
{
int w;
int parent;
int lchild,rchild;
}HTNode,*HuffmanTree;
void shaixuan(HuffmanTree H,int i,int &s1,int &s2)
{
int n = 1;
int j = 1;
int z;
while(j <= 2)
{
n = 1;
while(H[n].parent != 0)
{
n++;
}
z = n;
while(n<i)
{
n = n+1;
if(H[n].parent == 0)
{
if(H[z].w > H[n].w)
{
z = n;
}
}
}
if(j == 1)
{
s1 = z;
H[s1].parent = 1;
j++;
}
else
{
s2 = z;
j++;
}
}
}
void createmanTree(HuffmanTree &H,int n)
{
if(n<=1)
return ;
int m = 2*n-1; //赫夫曼共有这么多结点
H = new HTNode[m+1];
int i;
for(i = 1;i<=m;i++)
{
H[i].parent = 0;
H[i].lchild = 0;
H[i].rchild = 0;
}
i = 1;
while(i<=n)
{
cin>>H[i].w;
i++;
}
int j = n;
int s1,s2;
for(i = n+1;i<=m;++i)
{
shaixuan(H,i-1,s1,s2);
H[s1].parent = i;
H[s2].parent = i;
H[i].lchild = s1;
H[i].rchild = s2;
H[i].w = H[s1].w+H[s2].w;
}
}
void bianma(HuffmanTree H,int n)
{
char c[n][n+1];
char ch[n];
int i = 1;
int j,f,k = 0;
int z,m;
for(i = 1;i<=n;++i)
{
j = i;
f = H[i].parent;
k = 0;
while(f != 0)
{
if(H[f].lchild == j)
{
ch[k] = '0';
k++;
}
else
{
ch[k] = '1';
k++;
}
j = f;
f = H[f].parent;
}
ch[k] = '\0';
z = strlen(ch);
int u = 0;
for( m = z-1;m>=0;m--)
{
c[i-1][u] = ch[m];
u++;
}
c[i-1][u] = '\0';
}
i = 0;
while(i<=7)
{
j = 0;
cout<<"第"<<i+1<<"个字符的编码是 :";
while(c[i][j] != '\0')
{
cout<<c[i][j];
j++;
}
i++;
cout<<endl;
}
}
Status.h:
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
typedef int Status;
输出结果:
5 29 7 8 14 23 3 11
第1个字符的编码是 :0001
第2个字符的编码是 :10
第3个字符的编码是 :1110
第4个字符的编码是 :1111
第5个字符的编码是 :110
第6个字符的编码是 :01
第7个字符的编码是 :0000
第8个字符的编码是 :001
以上就是代码,没有什么难理解的,应该 都能看懂,这就是赫夫曼编码!如果上面代码有什么不懂的给我留言,我会告诉你们我的想法,当然,如果有不同的想法,希望让我学习一下,毕竟我接触数据结构的时间不长。谢谢大家的观看!