关闭

YTU 3027: 哈夫曼编码

446人阅读 评论(0) 收藏 举报
分类:

原文链接:https://www.dreamwings.cn/ytu3027/2899.html


3027: 哈夫曼编码

时间限制: 1 Sec  内存限制: 128 MB
提交: 2  解决: 2

题目描述

设计一个程序,构造一颗哈夫曼树,输出对应的哈夫曼编码。

输入

输入数据有两行,第一行为一个整数n,代表接下来要输入n个整数,然后我们用这n个整数构造一个哈夫曼树。

输出

输出对应的哈夫曼编码,每一个哈夫曼编码占一行。

样例输入

8
7 19 2 6 32 3 21 10

样例输出

1010
00
10000
1001
11
10001
01
1011


先建立哈夫曼树,然后从原有数据所在叶子节点向上回溯,保存哈夫曼编码输出~


AC代码:

#include<iostream>
#include<stdio.h>
#define MAXVALUE 0xfffff
using namespace std;

typedef struct      //构造哈夫曼树结点
{
    int weight;     //权值
    int parent;     //父节点
    int lchild;     //左子树
    int rchild;     //右子树
} HNodeType;

HNodeType HFMTree[105];//结点数
typedef struct      //构造哈夫曼编码数组
{
    int bit[105];
    int start;
} HCodeType;
HCodeType HFMCode[105];

void CreateHTree(HNodeType HFMTree[],int n)//创建哈夫曼树
{
    int m1,x1,m2,x2,i,j;

    for(i=0; i<2*n-1; i++)      //初始化
        HFMTree[i].parent=HFMTree[i].lchild=HFMTree[i].rchild=-1;
    for(i=0; i<n; i++)
        cin>>HFMTree[i].weight;

    for(i=0; i<n-1; i++)
    {
        x1=x2=MAXVALUE;
        m1=m2=0;
        for(j=0; j<n+i; j++)
        {
            if(HFMTree[j].parent==-1&&HFMTree[j].weight<x1)
            {
                x2=x1;
                m2=m1;
                x1=HFMTree[j].weight;
                m1=j;
            }
            else if(HFMTree[j].parent==-1&&HFMTree[j].weight<x2)
            {
                x2=HFMTree[j].weight;
                m2=j;
            }
        }
        HFMTree[m1].parent=n+i;
        HFMTree[m2].parent=n+i;
        HFMTree[n+i].weight=HFMTree[m1].weight+HFMTree[m2].weight;
        HFMTree[n+i].lchild=m1;
        HFMTree[n+i].rchild=m2;
    }
}
void CreateHCode(HNodeType HFMTree[],HCodeType [],int n)     //转化编码
{
    HCodeType cd;
    int i,j,c,p;
    for(i=0; i<n; i++)
    {
        cd.start=n-1;
        c=i;
        p=HFMTree[c].parent;
        while(p!=-1)
        {
            if(HFMTree[p].lchild==c)cd.bit[cd.start]=0;
            else cd.bit[cd.start]=1;
            cd.start--;
            c=p;
            p=HFMTree[c].parent;
        }
        for(j=cd.start+1; j<n; j++)
            HFMCode[i].bit[j]=cd.bit[j];
        HFMCode[i].start=cd.start+1;
    }
}

int main()
{
    int i,j,n;
    cin>>n;
    CreateHTree(HFMTree,n);
    CreateHCode(HFMTree,HFMCode,n);
    for(i=0; i<n; i++,puts(""))
        for(j=HFMCode[i].start; j<=n-1; j++)
            cout<<HFMCode[i].bit[j];
    return 0;
}


1
0
查看评论

最优前缀编码树及哈夫曼树

赫夫曼二叉树在通讯编码中的一个应用是利用它构造一组最优前缀编码。在某些通讯场合,需将传送的文字转换成由二进制字符组成的字符串。   通常有两类二进制编码:一类为等长编码,这类编码的二进制串的长度取决于电文中不同的字符个数,假设需传送的电文中只有四种字符,只需两位字符的串便可分辨,但如果电文中可能出现...
  • baidu_34372014
  • baidu_34372014
  • 2017-01-08 01:08
  • 783

赫夫曼树

定义和原理从树中一个结点到另一个结点之间的分支构成两个结点之间的路径,路径上的分支数目称做路径长度。树的路径长度就是从树根到每一结点的路径长度之和。带权路径长度WPL最小的二叉树称做赫夫曼树,也为最优二叉树。介绍了赫夫曼树构造的赫夫曼算法描述,重点的应用是赫夫曼编码,利用赫夫曼树来构造最优二叉树后,...
  • dengpei187
  • dengpei187
  • 2016-07-13 14:14
  • 269

赫夫曼树

问题 G 算法6-12:自底向上的赫夫曼编码 时间限制: 1 Sec  内存限制: 128 MB [提交] 题目描述 在通讯领域,经常需要将需要传送的文字转换成由二进制字符组成的字符串。在实际应用中,由于总是希望被传送的内容总长尽可能的短,如果...
  • qq_32126633
  • qq_32126633
  • 2016-05-24 20:54
  • 998

哈夫曼编码

数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory limit: 65536K 题目描述 字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完...
  • became_a_wolf
  • became_a_wolf
  • 2015-11-05 23:02
  • 1156

《哈夫曼编码的实现和应用(编码和译码)》

一、     Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般称为哈夫曼编码(有时也称为霍夫曼编码)。 二、背景:       1951年,霍夫曼和他在MIT信息论的...
  • WuchangI
  • WuchangI
  • 2017-12-07 19:59
  • 246

【并查集】UVALive3027 Corporative Network

【并查集】UVALive3027 Corporative Network并查集——维护到根节点距离的d数组题目大意对n个节点操作,加边 or 询问某节点到根节点的距离 说一下思路之前做过一道求连通分支最大元素个数的题目,维护的是一个cnt[ ]数组(在加边的过程中);比较这道题,可以考虑维护到根节...
  • u012717411
  • u012717411
  • 2015-08-26 10:24
  • 583

UVALive 4730 -树状数组+带权并查集

题意:有T组测试数据,每组数据的N表示有N个城市,接下来的N行里每行给出每个城市的坐标(0 (1)"road A B",表示将城市A和城市B通过一条道路连接,如果A和B原来属于不同的城市群,经过这个操作,A和B就在一个城市群里了,保证每条道路不会和其他道路相交(除了端点A和B)...
  • viphong
  • viphong
  • 2016-08-18 23:19
  • 183

nyoj801 哈夫曼编码,输入有毒

哈夫曼编码实现
  • cai13160674275
  • cai13160674275
  • 2016-02-28 14:46
  • 483

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)

Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)flyfish 2015-8-1Huffman tree因为翻译不同所以有其他的名字 赫夫曼树、霍夫曼树、哈夫曼树 定义引用自严蔚敏《数据结构》 路径 从树中一个结点到另一个结点之间的分支构成两个结点之间的路径.路径长度 路...
  • flyfish1986
  • flyfish1986
  • 2015-08-01 22:37
  • 2689
    个人资料
    • 访问:355923次
    • 积分:10201
    • 等级:
    • 排名:第2008名
    • 原创:709篇
    • 转载:12篇
    • 译文:0篇
    • 评论:83条
    寻找 Qianqian 遇见 就是幸运
    博客专栏
    欢迎关注 <千与梦随> 哦!
    最新评论