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

数据结构实验之二叉树六:哈夫曼编码
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description

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

AAAAABCD
THE_CAT_IN_THE_HAT

Sample Output

64 13 4.9
144 51 2.8

#include
#include
#include
#include

using namespace std;

int main()
{
    char s[10001];
    while(scanf("%s", s) != EOF)
    {
        priority_queue < int , vector, greater > q;
        //利用优先队列,从小到大排序
        //less是从大到小,greater是从小到大。
        int len = strlen(s);
        int i, max = 0;
        int count[256] = {0};
        for(i = 0; i < len; i++)
        {
            count[s[i]]++;//统计字符出现的频率,利用ASCII对应其数组的下标
            if(s[i] > max)
                max = s[i];//找出频率最高的字符,为下一步次数入栈做准备
        }
        for(i = 0; i <= max; i++)
        {
            if(count[i] != 0)
                q.push(count[i]);
        }
        int sum = 0;
        while(!q.empty())//当队列不为空的时候弹出值
        {
            int a = q.top();//出第一个值
            q.pop();
            if(!q.empty())
            {
                int b =  q.top();//出第二个值
                q.pop();
                sum += (a + b);//模拟构造赫夫曼树的过程,不过不理解如下面的例题所示。
                q.push(a + b);
            }
        }
        printf("%d %d %.1f\n", len * 8, sum, len * 8.0 / sum);
    }
    return 0;
}

解释:
首先构造huffman树
每一步都将所有数字排序
方法如下:
1:
3 5 6 7
2:
6 7 8
/
3 5
3:
8 13
/ \ /
3 5 6 7
4:
21
/
8 13
/ \ /
3 5 6 7
所以构造哈夫曼树如图
7 6 3 5 分别对应a b c d
如果左边为0 ,右边为 1 ,则他们编码分别为:
a 11
b 10
c 00
d 01
长度为2

原文:https://blog.csdn.net/dreamzuora/article/details/53450510

你可能感兴趣的:(数据结构二叉树)