sdut 数据结构实验之二叉树六:哈夫曼编码
来源:互联网 发布:电脑怎么激活windows 编辑:程序博客网 时间:2024/05/16 09:08
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;int main(){ char s[10000]; while(scanf("%s",s)!=EOF) { priority_queue < int,vector<int>,greater<int> > Q;//利用优先队列,从小到大排序 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;}
例题:一组字符(a,b,c,d)在文中出现的次数分别为(7,6,3,5),字符'd'的哈夫曼编码的长度为?
首先构造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
0 0
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
- sdut oj3345 数据结构实验之二叉树六:哈夫曼编码
- sdut 数据结构实验之二叉树六:哈夫曼编码
- SDUT-3345 数据结构实验之二叉树六:哈夫曼编码
- SDUT-数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- sdutoj 3345 数据结构实验之二叉树六:哈夫曼编码
- SDUT3345数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- SDUTACM 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- 数据结构实验之二叉树六:哈夫曼编码
- Ubuntu 16.04 LTS 安装 Nginx/PHP 7/MySQL 5.7 (LEMP)
- javascript复制网页内容 execCommand(´ Copy´ )
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.2 保护模式内存管理
- 优先队列c++ STL用法
- Ultra-Pull-To-Refresh 自定义下拉刷新视差动画
- sdut 数据结构实验之二叉树六:哈夫曼编码
- Linux最基本的一些命令
- Android 解决ListView、GridView在首次显示时adapter可能多次调用getView的问题
- 赫夫曼编码长度计算问题?
- [Leetcode] Container With Most Water Python
- 模拟题:流量问题
- 446. Arithmetic Slices II - Subsequence
- 树结构练习——判断给定森林中有多少棵树-并查集
- java多线程-03-阻塞队列简介