基于双队列实现huffman树
来源:互联网 发布:郑州财经学院网络下线 编辑:程序博客网 时间:2024/05/22 14:32
今天数算课讲huffman树,是基于堆实现的,突然想起以前实现过基于双队列的huffman树,做个回顾。
首先将n个元素从小到大排序,基于比较的排序都是nlogn的复杂度,这里可以考虑用计数排序(即桶排序)或者基数排序尝试优化到n试试。
然后我们获得了一个有序队列我们把它放在A队列中,然后再找一个空的B队列。
然后从A中或者B中找出两个最小的元素,累加放入B队列的队尾加入。不难发现B队列也是递增的。这样模拟每次取最小的两个。
仔细一想,原先需用插入堆中,动态询问最小值的问题,被我们用双队列取代了,之所以能用双队列实现,
因为这个问题特殊在它每次产生的新的数是由两个最小的数产生的,这样使得产生的值都是递增的。因此才可以用双队列去优化它。
// 双队列实现huffman树#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <queue>using namespace std;const int MAXN = 100+5;int test,n,a[MAXN];queue<int> qa,qb;int get(){int t;if (qb.empty()){t = qa.front(); qa.pop();return t;}if (qa.empty()){t = qb.front(); qb.pop();return t;}if (qa.front() < qb.front()) {t = qa.front(); qa.pop();} else {t = qb.front(); qb.pop();}return t; }int main(){cin>>test;while (test--){cin>>n;while (!qa.empty()) qa.pop();while (!qb.empty()) qb.pop();for (int i = 1; i <= n; ++i)cin>> a[i];sort(a+1,a+n+1); // 可以尝试用基数排序优化这部分时间复杂度for (int i = 1; i <= n; ++i) qa.push(a[i]);int sum = 0;for (int i = 1; i < n; ++i) {int t1 = get();int t2 = get();sum += (t1+t2);qb.push(t1+t2);}cout << sum << endl;}return 0;}
- 基于双队列实现huffman树
- 优先队列实现Huffman树
- Huffman编码优先队列实现
- huffman树_优先权队列
- 用优先队列的huffman编码实现
- Huffman树的实现
- 实现huffman树
- Huffman树实现
- java实现Huffman树
- 实现Huffman树
- Huffman树的实现
- Huffman树的实现
- 基于Java实现的huffman编码
- Huffman树(使用优先队列优化)
- Huffman树与MinHeap实现
- Word2Vec里实现Huffman树
- Huffman树及其编码实现
- Huffman树的简单实现
- jcseg-1.9.0 发布 - 英文同义词追加+中英任意组合识别
- Linux就是这个范儿之第一次亲密接触(1)
- Spring, Hibernate, Maven, and Struts2 integration tutorial
- WINCE5.0上USB设备的自动检测
- About IndexDB
- 基于双队列实现huffman树
- fromImageReader的用法
- 看看你会几个?9大最火的移动开发技能
- 创建一个包含iterator类的简单容器类
- 全排列
- 直线绘制算法
- uva 10635 - Prince and Princess
- Linux的nl命令
- 惊艳!9个不可思议的 HTML5 Canvas 应用试验