首页 > 其他分享 >hdu最佳编码(哈夫曼编码)

hdu最佳编码(哈夫曼编码)

时间:2022-12-01 23:46:44浏览次数:40  
标签:编码 hdu 文本 qu 哈夫曼 int str include

Problem Description

文本编码是计算机通信中的常见问题。

以文本“AAAAABCD”为例,如果使用ASCII,则一共需要64位(因为每个字符的ASCII编码都是需要8位)。

对应的,如果我们将A编码为“00”,“B”为“01”,“C”为“10”,“D”为“11”,那么我们可以只编码16位; 得到的位模式将是“0000000000011011”。然而,这仍然是一种固定长度的编码。

由于字符“A”的出现频率较高,我们是否可以通过用较少的位对它进行编码来获得更好的效果?

事实上,我们确实可以。

最佳编码是将“A”标记为“0”,“B”标记为“10”,“C”标记为“110”,“D”标记为“111”。(显然,这不是唯一的最佳编码,因为很显然,对B,C和D可以自由交换,而不增加最终编码的大小。)

使用这种编码,上述的字符串仅需要13位,编码为“0000010110111”,相对ASCII编码方案,压缩比为4.9比1。通过从左到右读取该编码,您会发现,无前缀编码可以很容易地将其解码为原始文本,即使代码具有不同的位长度。

Input
输入包含多组文本字符串,每行一个。
文本字符串将只包含大写字母、数字字符和下划线(用于代替空格)。
单词“END”表示输入结束,不做处理。

Output
对于输入中的每个文本字符串,输出8位ASCII编码的长度、最佳编码的长度,以及对应的压缩率比值,压缩比精确到小数点后一位。


输入样例

AAAAABCD
THE_CAT_IN_THE_HAT
END
 

输出样例

64 13 4.9
144 51 2.8
附ac代码
#include<iostream>
#include<cstdio>
#include<cstring> 
#include<queue>
#include<cmath>
using namespace std;
int ch[40];
int bfs()
{
    int a,b;
    int ans=0;
    priority_queue<int,vector<int>,greater<int> >qu;//实现小顶堆 优先队列默认大顶堆
    //注意int的尖括号和queue的尖括号之间要有空格 
    for(int i=0;i<=37;++i)
    {
        if(ch[i]) qu.push(ch[i]); 
        //哈夫曼编码的编码长度与树的深度相同故求总长即求树的带权路径 
    }
    if(qu.size()==1)
    ans=qu.top();
    //哈夫曼编码若结点大于1一定时完全二叉树
    while(qu.size()>1)
    {
        a=qu.top();
        qu.pop();
        b=qu.top();
        qu.pop();
        ans+=(a+b);
        qu.push(a+b); 
     }
    return ans; 
}
int main()
{
    string str;
    while(cin>>str)
    {
        if(str[0]=='E'&&str[1]=='N'&&str[2]=='D'&&str.size()==3)
        break;
        memset(ch,0,sizeof(ch));
        for(int i=0;i<str.size();++i)
        {
            if(str[i]=='_')
            ch[26]++;
            else
            {
                if(str[i]>='A'&&str[i]<='Z')
                ch[str[i]-'A']++;
                else
                ch[str[i]-'0'+28]++;
            }
        }
        int ans1=str.size()*8,ans2=bfs();
        double ans3=round(((double)ans1/ans2)*10)/10;
        printf("%d %d %.1lf\n",ans1,ans2,ans3);
    }
    return 0;
}

 

 

标签:编码,hdu,文本,qu,哈夫曼,int,str,include
From: https://www.cnblogs.com/ruoye123456/p/16943156.html

相关文章

  • 哈夫曼树
    typedefstructTreeNode*HuffmanTree;structTreeNode{intWeight;HuffmanTreeLeft,Right;};HuffmanTreeHuffman(MinHeapH){BulidMinHeap(H);......
  • hdu棋盘游戏(二分图匹配)
    题目描述ProblemDescription小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限......
  • 哈夫曼树
    哈夫曼树概念哈夫曼(Huffman)树又称最优二叉树。它是n个带权叶子结点构成的二叉树中,带权路径长度WPL最小的二叉树。因为构造这种树的算法是最早由哈夫曼于1952年提出的,所以......
  • 哈夫曼编码
    这是今天的第二篇博客,也是有关数据结构的实验题,实现哈夫曼编码题目要求:输入一组整型权值,构建哈夫曼树,实现哈夫曼编码,并输出带权路径长度。输入格式:第一行输入叶子结点......
  • spring boot配置文件之properties的编写与配置文件编码问题
    1、将yml文件中的配置   ctrl+/  注释掉#server:#port:8090##person:#age:18#boss:false#birth:2017/12/12#maps:{k1:v1,k2:12}......
  • 转速测量脉冲信号采集 Modbus模块 编码器脉冲计数器pnp/npn转485可识别正反转
    特点:●编码器解码转换成标准ModbusRTU协议●可用作编码器计数器或者转速测量●支持编码器计数,可识别正反转●也可以设置作为2路独立DI高速计数器●计数值支持断电自动......
  • 信息论与编码:随参信道特性
    随参信道的传输特性主要依赖于传输媒质特性,以电离层反射信道、对流层散射信道为主要代表。随参信道是一种信道传输特性随时间随机快速变化的信道,包括陆地移动信道,短波电离......
  • 【数据结构-树】哈夫曼树及其应用
    目录1哈夫曼树的构造2哈夫曼树的应用——哈夫曼编码3相关例子1哈夫曼树的构造将n个结点作为n棵仅含一个节点的二叉树,构成森林F在F中选取两棵权值最小的二叉......
  • hdu 5418 Victor and World
    hdu5418VictorandWorldTimeLimit:4000/2000MS(Java/Others)    MemoryLimit:262144/131072K(Java/Others)链接:http://acm.hdu.edu.cn/showproblem.php?pi......
  • spring mvc 环境 过滤器设置utf8字符编码和配置Logback日志及json支持(四)
    web.xml配置过滤器支持中文的请求和响应<filter><filter-name>characterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.Char......