已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试编写算法求其赫夫曼编码。

来源:互联网 发布:mac excel求和快捷键 编辑:程序博客网 时间:2024/06/04 19:56

 已知某系统在通信联络中只可能出现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


以上就是代码,没有什么难理解的,应该 都能看懂,这就是赫夫曼编码!如果上面代码有什么不懂的给我留言,我会告诉你们我的想法,当然,如果有不同的想法,希望让我学习一下,毕竟我接触数据结构的时间不长。谢谢大家的观看!

0 0
原创粉丝点击