栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 1880 Variable Radix Huffm...

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 1880 Variable Radix Huffm...

#include<cstdio>#include<deque>#include<algorithm>#include<string>using namespace std;const int DIGIT_NUM_MAX=10,LETTER_NUM_MAX=40;class Huffman{public:Huffman();bool Read();bool Solve();private:bool Initialize();int digitNum,letterNum,ID;struct Node{char value;int frequency;string pre;Node *child,*sibling;};Node* letter[LETTER_NUM_MAX];deque<Node*> tree;bool Coding(Node*,string);static bool DeleteNode(Node*);static bool NodeCompare(Node*,Node*);};Huffman::Huffman(){ID=0;Initialize();}bool Huffman::Read(){ID++;Initialize();scanf("%d",&digitNum);if(digitNum==0)return false;scanf("%d",&letterNum);for(int i=0;i<letterNum;i++){letter[i]=new Node;letter[i]->value='A'+i;scanf("%d",&letter[i]->frequency);letter[i]->child=letter[i]->sibling=NULL;tree.push_back(letter[i]);}while((tree.size()-1)%(digitNum-1)!=0){Node* fictitious=new Node;fictitious->value=CHAR_MAX;fictitious->frequency=0;fictitious->child=fictitious->sibling=NULL;tree.push_back(fictitious);}return true;}bool Huffman::Solve(){while(tree.size()>=digitNum){sort(tree.begin(),tree.end(),NodeCompare);Node* combine=new Node;combine->value=CHAR_MAX;combine->frequency=0;combine->child=tree.front();combine->sibling=NULL;for(int i=0;i<digitNum;i++){if(combine->value>tree[i]->value)combine->value=tree[i]->value;combine->frequency+=tree[i]->frequency;if(i+1<digitNum)tree[i]->sibling=tree[i+1];}tree.erase(tree.begin(),tree.begin()+digitNum);tree.push_front(combine);}Coding(tree.front(),"");double average=0.0;for(int i=0;i<letterNum;i++)average+=letter[i]->frequency*letter[i]->pre.length();average/=tree.front()->frequency;printf("Set %d; average length %.2lfn",ID,average);for(int i=0;i<letterNum;i++)printf("    %c: %sn",letter[i]->value,letter[i]->pre.c_str());printf("n");return true;}bool Huffman::Initialize(){digitNum=letterNum=0;while(!tree.empty()){DeleteNode(tree.front());tree.pop_front();}return true;}bool Huffman::Coding(Node* root,string newCode){root->pre=newCode;if(root->child!=NULL)Coding(root->child,newCode+"0");if(root->sibling!=NULL){newCode[newCode.length()-1]++;Coding(root->sibling,newCode);}return true;}bool Huffman::DeleteNode(Node* root){if(root==NULL)return false;DeleteNode(root->child);DeleteNode(root->sibling);delete root;}bool Huffman::NodeCompare(Node* left,Node* right){if(left->frequency!=right->frequency)return left->frequency<right->frequency;return left->value<right->value;}int main(){Huffman test;while(test.Read())test.Solve();return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/377701.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号