zoukankan      html  css  js  c++  java
  • 数据结构实验之二叉树六:哈夫曼编码

                                                                   数据结构实验之二叉树六:哈夫曼编码

                                                                                          Time Limit: 1000MS Memory Limit: 65536KB

    Problem Description

    字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码。该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码。哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%90%之间。你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼编码长度的比值。

    Input

     输入数据有多组,每组数据一行,表示要编码的字符串。

    Output

     对应字符的ASCII编码长度lahuffman编码长度lhla/lh的值(保留一位小数),数据之间以空格间隔。

    Example Input

    AAAAABCD
    THE_CAT_IN_THE_HAT

    Example Output

    64 13 4.9
    144 51 2.8

    #include <bits/stdc++.h> 
    using namespace std;
    int pp[10086];
    char str[10086];
    int n,i;
    int main()
    {
    	while(scanf("%s",str)!=EOF)
    	{
    		memset(pp,0,sizeof(pp));
    		priority_queue<int,vector<int>,greater<int> >Q;
    		int len = strlen(str);
    		for(i=0;i<len;i++)
    		{
    			pp[str[i]]++;
    		}
    		for(i=0;i<140;i++)
    		{
    			if(pp[i])
    			{
    				Q.push(pp[i]);
    			}
    		}
            int sum=0;
    		while(!Q.empty())
    		{	int ans = 0;	
    			int a = Q.top();
    			Q.pop();
    			if(!Q.empty())
    			{  
    				int b = Q.top();
    				Q.pop();
    				ans += a+b;
    				sum+=ans;
    				Q.push(ans);
    			}
    		}
    		cout<<len*8<<" "<<sum<<" "<<setprecision(2)<<len*1.0*8/sum<<endl;
    	}
    	return 0;
    }
    
    

  • 相关阅读:
    [转] 美股评论:远离波动的噪音
    [转] GDB 下 watch的使用
    [转] Web性能压力测试工具之ApacheBench(ab)详解
    [转] Ubuntu 12.04下LAMP安装配置 (Linux+Apache+Mysql+PHP)
    [转] 在 Linux 中怎样使用cp命令合并目录树
    [转] postgresql常用命令
    [转] 跟着美联储投资
    [转] 智能指针(三):unique_ptr使用简介
    关于前端开发
    [转] 美股评论:美国散户血泪辛酸
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/6444587.html
Copyright © 2011-2022 走看看