您的位置:首页 > 理论基础 > 数据结构算法

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

2017-11-12 11:01 267 查看

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

Time Limit: 1000MS
Memory Limit: 65536KB
[align=center][/align]

Problem Description

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

Input

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

Output

 对应字符的ASCII编码长度la,huffman编码长度lh和la/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;

typedef struct Tree

{

    char data;

    Tree *left,*right;

}*P;

char ch[128];

int a[128],b[128];

int main()

{

    while(cin>>ch)

    {

        int len=strlen(ch);

        int i,j,t,num=0;

        for(i=0;i<128;i++)

        {

            a[i]=0;

        }

        for(i=0;i<len;i++)

        {

            a[ch[i]]++;

        }

        for(i=0;i<128;i++)

        {

            if(a[i]!=0)

            {

                b[num++]=a[i];

            }

        }

        int sum=0,k=0;

        while(k<num-1)

        {

            /*for(i=k;i<num-1;i++)

            {

                for(j=k;j<num-i-1;j++)

                {

                    if(b[j]>b[j+1])

                    {

                        t=b[j];

                        b[j]=b[j+1];

                        b[j+1]=t;

                    }

                }

            }

            for(i=k;i<num;i++)

            {

                cout<<b[i]<<" ";

            }*/

            sort(b+k,b+num);

            int x1=b[k++];

            int x2=b[k++];

            b[num++]=x1+x2;

            sum+=x1+x2;

        }

        float x=(float)(len+0.0)*8/(sum+0.0);//强制转换

        printf("%d %d %.1f\n",len*8,sum,x);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: