数据结构综合应用题:Huffman数的应用

本文探讨了如何为特定报文“AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF”设计哈夫曼编码。详细介绍了计算字符概率、构建哈夫曼树的过程,并提供了哈夫曼编码的详细步骤。同时,文章还讨论了如何用C++实现哈夫曼编码,以及算法的时间复杂度和空间复杂度分析。
摘要由CSDN通过智能技术生成

所选题目:哈夫曼树的应用 题目描述:要传输一则报文内容如下: “AAAAAAAAAAAAAAABBBBBBBBBCCCCCCCCDDDDDDDDDDDDEEEEEEEEEEFFFFF” 请为这段报文设计哈夫曼编码,要求如下:

1) 请计算出每个字符出现的概率,并以概率为权重来构造哈夫曼树,写出构造过程、画出 最终的哈夫曼树,得到每个字符的哈夫曼编码。

①计算每个字符出现的概率

由报文内容分析知 共有A:15个 B:9个 C:8个 D:12个 E:10个 F:5个 共计59个字符 故每个字符出现的概率如下

A:15/59 B:9/59 C:8/59 D:12/59 E:10/59 F:5/59

②构造哈夫曼树

<第一步>选择权重最小的两个编码 分别是F:5/59 和 C:8/59 并计算其权重的和为 13/59 并将新生成的结点记为M1。

IMG_0847(20200626-131712).PNG

<第二步>再次选择权重最小的两个编码 分别是B:9/59 和 E:10/59 并计算其权重的和为 19/59 并将新生成的结点记为M2。 IMG_0848(20200626-132227).PNG

<第三步>再次选择权重最小的两个编码 分别是D:12/59 和 M1:13/59 并计算其权重的和为 25/59 并将新生成的结点记为M3。

IMG_0849(20200626-132428).PNG

<第四步>再次选择权重最小的两个编码 分别是A:15/59 和 M2:19/59 并计算其权重的和为 34/59 并将新生成的结点记为M4。

IMG_0850(20200626-132615).PNG

<第五步>再次选择权重最小的两个编码 分别是M3:25/59 和 M4:34/59 并计算其权重的和为 1 并将新生成的结点记为M5 是该哈夫曼树的根节点。

IMG_0851(20200626-132644).PNG

③求哈夫曼编码

IMG_0852(20200626-133030).PNG 由图可知

A的哈夫曼编码:10

B的哈夫曼编码:110

C的哈夫曼编码:011

D的哈夫曼编码:00

E的哈夫曼编码:111

F的哈夫曼编码:010

2) 请将上述设计哈夫曼编码的过程,用代码来实现,并输出各个字母的哈夫曼编码。(有 代码,有运行结果的截图)

#include<iostream>
#include<string.h>
#include<stdlib.h>
#define MAXSIZE 9999999
using namespace std;
//201831061127 黄震 数据结构大作业 
//定义Huffman Tree的结构体 
struct Huffman
{
   
    int weight=0;//结点的权重 
    char node='\0';//当前结点的字符 
    string HuffmanCode="";//Huffman编码 
    Huffman *lchild;//左孩子 
    Huffman *rchild;//右孩子 
    Huffman *parents;//父亲结点 
};
void GetHuffmanCode(Huffman *root);//读取Huffman编码的函数 
Huffman *GetWeight(Huffman *root,Huffman *lchild,Huffman *rchild);//给每个节点赋权值的函数 
int main()
{
   
    int i,treenode;
    int eyeson[200];//记录每次循环的中间量的标记数组 
    memset(eyeson,0,sizeof(eyeson));//初始化 
    Huffman *root;
    char code[100];
    Huffman node[51];
    cout<<"SWPU 201830161127 黄震 数据结构大作业 代码实现部分"<<endl;
    cout<<endl;
    cout<<"请输入 需要转化为Huffman编码的序列"<<endl;
    cin>>code;
    for(i=0;i<51;i++)
    node[i].lchild=node[i].rchild=node[i].parents=NULL;//将所有结点初始化为NULL
    for(i=0;i<strlen(code);i+&
  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值