018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记
来源:互联网 发布:凡科建站能做seo吗 编辑:程序博客网 时间:2024/04/30 00:11
Huffman树是完全二叉树,权重较大的节点距离根较近。
Huffman编码是一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字。
基本思路:
建立Huffman树的过程:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。n个权值分别设为w1、w2、…、wn,则哈夫曼树的构造规则为:
(1) 将w1、w2、…,wn看成是有n棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
选取权值最小的结点时我们用最小堆。
需要得出各个字母的具体编码,我们只需要在所有的左儿子的边标上0,右儿子的边标上1,从根节点到目标节点的所有经过的边的码就是该字母的编码。
算法分析:
假设有n个字符。
把所有字符插入堆需要Θ(n),从堆中删除两个元素和新加一个元素需要O(log n)。重复n-1次,所以总的时间复杂度是O(n log n)。
伪代码:
C++代码:
//计算哈夫曼编码下的文本占的位数,并与定长编码的比较。#include<iostream>#include<string>#include<cstring>#include<iomanip>#include<cstdio>#include<queue> //哈夫曼树,用优先队列实现using namespace std;int main(){string s;while (cin >> s){if (s == "END") break;int len = s.size();int date[30] = { 0 }; //date数组记录text中各个字符的频数priority_queue<int>q;for (int i = 0; i < len; i++){if (s[i] == '_') date[0]++;else date[s[i] - 'A' + 1]++;}for (int i = 0; i < 27; i++){if (date[i]!=0) q.push(-date[i]); //只把不同字符的频数加入优先队列,字符本身与题目要求无关} //处理使小的数据的优先级别高int ans = 0;int tem;while (!q.empty()){tem = -q.top(); //取出最小的两个数,相加累计到ans中,并加入队列,一直处理到队列中没有数q.pop();if (!q.empty()){tem = tem - q.top();q.pop();}ans = ans + tem;if (!q.empty()) q.push(-tem); //若队列已没有数据,则不添加(上面已经取出最后两个,或一个),若没有这一步,上面whlie的判断不成立。} int ans8 = len << 3;double bi = (double)ans8 / ans;printf("%d %d %.1lf\n", ans8, ans, bi);}}
0 1
- 018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 015-Dijkstra算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 016-kruskal算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 017-Prim算法-贪心-《算法设计技巧与分析》M.H.A学习笔记
- 013--Floyd算法-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 001-整数快速幂-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 003-生成排列-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 004-寻找多数元素-归纳法-《算法设计技巧与分析》M.H.A学习笔记
- 005-二分搜索-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 008-大整数乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 009-矩阵乘法-分治法-《算法设计技巧与分析》M.H.A学习笔记
- 012-矩阵链相乘-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 014-背包问题-动态规划-《算法设计技巧与分析》M.H.A学习笔记
- 019-dfs.bfs-图的遍历-《算法设计技巧与分析》M.H.A学习笔记
- 020-寻找图的关节点-dfs-《算法设计技巧与分析》M.H.A学习笔记
- 022-3着色问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 023-8皇后问题-回溯法-《算法设计技巧与分析》M.H.A学习笔记
- 021-回溯法与深搜的关系-《算法设计技巧与分析》M.H.A学习笔记
- SQL和NoSQL数据库的差别
- OutputFormat的自我理解
- ORA-12560:TNS
- 剑指offer-整数中1出现的次数(从1到n整数中1出现的次数)
- nginx root alias 区别
- 018-Huffman树-贪心-《算法设计技巧与分析》M.H.A学习笔记
- Docker的网络配置,导致Docker使用网路很慢的问题及解决办法
- 正则表达式与sql交互
- block在ARC/非ARC下的使用
- 专题四1008
- 理解Python WSGI
- U-BOOT 移植过程详解:添加一块新板子的支持
- 2016 大一下学期期末C++课程总结
- Android 使用Socket实现服务器与手机客户端的长连接六:二次封装