哈夫曼树 优先队列STL的应用
2012-08-25 13:10
260 查看
最近每次做题都要看很多资料。看来是真的老了。
这题给定字符串,以及待编码的字符数,采用哈夫曼编码,编码总长度最短。求此值。
这题添加虚拟节点,使得最后的合并方便,也就是使得每次合并保证树中都大于T个。T为提供的编码字符数。
相当于每一个节点要么是空的要么是有T个孩子的。
设待编码字符为N,添加的虚节点个数为β。
那么对(N+β)进行一次合并-> (N+β)-T+1 第二次合并 (N+β)-2*(T-1)
......
最后一次(N+β)-r*(T-1)=1
也就是(N+β)%(T-1)==1%(T-1); 好像出现了同余
...
下面代码基本上是段学妹的.. 我待会儿看看STL的一些个东西...
PS:据说priority_queue内部是用红黑树实现的,跪了....
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
bool cmp( int a,int b ){
return a<b;
}
int main()
{
freopen( "K.in","r",stdin );
freopen( "ans.out","w",stdout );
char str[111111];
int n;
map<char,int> mp;
map<char,int>::iterator it;
priority_queue< int,vector<int>,greater<int> >que;
while( gets(str) )
{
scanf( "%d",&n );
getchar();
mp.clear();
for( int i=0;i<strlen(str);i++ )
mp[str[i]]++;
while( !que.empty() ) que.pop();
for( it=mp.begin();it!=mp.end();it++ )
que.push((*it).second);
while( que.size()%(n-1)!=1%(n-1))
que.push(0);
int ans=0;
if( mp.size()<=n )
ans = strlen(str);
else
{
while( que.size()!=1 )
{
int su=0;
for( int i=0;i<n;i++ )
{
su+=que.top();
que.pop();
}
ans+=su;
que.push(su);
}
}
printf( "%d\n",ans );
}
return 0;
}
这题给定字符串,以及待编码的字符数,采用哈夫曼编码,编码总长度最短。求此值。
这题添加虚拟节点,使得最后的合并方便,也就是使得每次合并保证树中都大于T个。T为提供的编码字符数。
相当于每一个节点要么是空的要么是有T个孩子的。
设待编码字符为N,添加的虚节点个数为β。
那么对(N+β)进行一次合并-> (N+β)-T+1 第二次合并 (N+β)-2*(T-1)
......
最后一次(N+β)-r*(T-1)=1
也就是(N+β)%(T-1)==1%(T-1); 好像出现了同余
...
下面代码基本上是段学妹的.. 我待会儿看看STL的一些个东西...
PS:据说priority_queue内部是用红黑树实现的,跪了....
#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
bool cmp( int a,int b ){
return a<b;
}
int main()
{
freopen( "K.in","r",stdin );
freopen( "ans.out","w",stdout );
char str[111111];
int n;
map<char,int> mp;
map<char,int>::iterator it;
priority_queue< int,vector<int>,greater<int> >que;
while( gets(str) )
{
scanf( "%d",&n );
getchar();
mp.clear();
for( int i=0;i<strlen(str);i++ )
mp[str[i]]++;
while( !que.empty() ) que.pop();
for( it=mp.begin();it!=mp.end();it++ )
que.push((*it).second);
while( que.size()%(n-1)!=1%(n-1))
que.push(0);
int ans=0;
if( mp.size()<=n )
ans = strlen(str);
else
{
while( que.size()!=1 )
{
int su=0;
for( int i=0;i<n;i++ )
{
su+=que.top();
que.pop();
}
ans+=su;
que.push(su);
}
}
printf( "%d\n",ans );
}
return 0;
}
相关文章推荐
- 17年东北四省赛A题-简单stl应用-优先队列
- 优先队列的STL运用与哈夫曼树的实现
- STL 优先队列-- 树-堆结构练习——合并果子之哈夫曼树
- c++STL数据结构之优先队列queue应用
- 优先队列的基本操作实现与应用(Java实现)
- 优先队列C++实现和应用
- POJ -3253 优先队列 STL
- 优先队列-stl
- STL中优先队列的用法
- STL 优先队列、队列、栈的使用
- poj 3253 Fence Repair (STL优先队列)
- Luogu 1090 合并果子(贪心,优先队列,STL运用)
- POJ 3253 Fence Repair 题解(优先队列实现哈夫曼树)
- STL之queue队列 stack栈 priority_queue优先队列 deque双向队列
- STL---priority_queue 优先队列概述。
- 数据结构: 优先队列的应用
- 【HDU】4857 - 逃生(拓扑 & STL - vector & 优先队列 & 栈,反向拓扑好题)
- C++ 标准模板库STL 双端队列 deque 使用方法与应用介绍(一)
- HDU 1896 Stones (优先队列的应用)
- STL中的优先队列(堆)