已知某系统在通信联络中只可能出现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
以上就是代码,没有什么难理解的,应该 都能看懂,这就是赫夫曼编码!如果上面代码有什么不懂的给我留言,我会告诉你们我的想法,当然,如果有不同的想法,希望让我学习一下,毕竟我接触数据结构的时间不长。谢谢大家的观看!
- 已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试编写算法求其赫夫曼编码。
- 已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试编写算法求其赫夫曼编码。
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 算法---在一个字符串中找到第一个只出现一次的字符
- 算法学习七----在一个字符串中找到第一个只出现一次的字符
- 微软算法100道题-----:在一个字符串中找到第一个只出现一次的字符
- 哈弗曼编码算法(输入若干字符 及 出现概率,输出对应的二进制编码)
- 从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为”cocoon”,删除重复出现的字符后,其结果是字符串”con”。
- 定义一个字符串类DelSameStr,从左到右对字符串中每个字符删除其后所有相同的字符,只留下第一次出现的那一个。例如,若字符串为”cocoon”,删除重复出现的字符后,其结果是字符串”con”
- 在一个字符串中查找第一个只出现一次的字符。要求复杂度为O(N).
- 在一个字符串中查找第一个只出现一次的字符,要求复杂度为O(N)
- 每天学习一算法系列(17)(在一个字符串中找到第一个只出现一次的字符)
- 数据结构——算法之(007)(在一个字符串中找到第一个只出现一次的字符)
- 算法与数据结构面试题(21)-在一个字符串中找到第一个只出现一次的字符
- 算法十二:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b
- 算法题:在一个字符串中找到只出现一次的字符。如输入abaccdeeff,则输出bd。
- 编码为 UTF-8 的JSP 文件中出现非法字符  问题
- 【算法习作】已知有一个数字在某数组中出现次数超过一半,求这个数
- SQL SERVER 2008 利用发布订阅方式实现数据库同步
- mysql涉及多个字段的模糊查询
- C语言DFS(7)___单词拼接(NYoj 99)
- 计算机随机数初探
- 剑指Offer之 - 二叉树的深度
- 已知某系统在通信联络中只可能出现8种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试编写算法求其赫夫曼编码。
- 黑马程序员—— JDK1.5,for循环的新写法
- android xlmns:android
- 【机房重构】——存储过程遇到的问题
- matlab一维搜索,用进退法确定搜索区间
- Ubuntu 12.04 64bit 安装 openedx
- 韩岩___第8课___《linux内核分析》MOOC课
- 关于Ongl技术探秘
- 使用 decode ,进行 行转列 变换