优先级队列实现哈夫曼树的编码和译码

简介:
复制代码
//优先级队列实现的哈夫曼树的编码和译码   
  
#include<iostream>      
#include<queue>      
#include<string>      
using namespace std;    
    
class Node     
{    
public:    
    float weight;    
    Node* left;    
    Node* right;    
    char ch;    
    
    Node(float w,Node* l=NULL,Node* r=NULL,char c=' '):weight(w),ch(c),left(l),right(r) {}    
    Node(float w,char c=' '):weight(w),ch(c),left(NULL),right(NULL) {}    
};    
    
class cmp    
{    
public :    
    bool operator()(Node* a,Node* b)    
    {    
        return a->weight>b->weight;    
    }    
};  
    
vector<int> v;     
void Encode(Node* r)//打印字符的编码       
{     
    if(r->left==NULL && r->right==NULL)     
    {     
        cout << r->ch <<": ";     
        for (int i = 0;i<v.size();++i)     
            cout << v[i];     
        cout << endl;     
        v.pop_back();     
        return ;     
    }     
    if(r->left)     
    {     
        v.push_back(0);     
        Encode(r->left);     
    }     
    if(r->right)     
    {     
        v.push_back(1);     
        Encode(r->right);     
    }    
    if(!v.empty())    
    {    
        v.pop_back();    
    }    
}    
    
void Decode(Node* root, string s)//译码       
{    
    Node* p=root;    
    for(int i=0;i<s.length();++i)    
    {    
        if(s[i]=='0')     
        {    
            if(p->left) p=p->left;    
            else     
            {    
                cout<<s<<" Can't decode!"<<endl;    
                return ;    
            }    
        }     
        if(s[i]=='1')     
        {     
            if(p->right) p=p->right;    
            else     
            {    
                cout<<s<<" Can't decode!"<<endl;     
                return ;    
            }    
        }    
    }    
    cout<<s<<": "<<p->ch<<endl;    
}    
    
void freeTree(Node* p)//销毁哈夫曼树      
{    
    if(p->left!=NULL)    
        freeTree(p->left);    
    if(p->right!=NULL)    
        freeTree(p->right);    
    delete p;    
    p=NULL;    
}    
    
int main()    
{    
    Node* m1,*m2;    
    char ch[]={'A','C','E','D','F','G'};//字符       
    float f[]={0.1,0.3,0.4,0.5,0.2,0.6};//频率       
  
    priority_queue<Node*,vector<Node*>,cmp> q;    
    int n=sizeof(ch)/sizeof(ch[0]);    
    for(int i=0;i<n;++i)    
    {    
        q.push(new Node(f[i],ch[i]));    
        cout<<ch[i]<<": "<<f[i]<<'\t';     
    }    
    cout<<endl;    
    for(int i=1;i<n;++i)    
    {    
        m1=q.top(); q.pop();    
        m2=q.top(); q.pop();    
        float w=m1->weight+m2->weight;    
        q.push(new Node(w,m1,m2));    
    }    
    Node* root=q.top();    
    Encode(root);    
    cout<<endl;    
    Decode(root,"1011");    
    freeTree(root);    
    
    return 0;    
}  
复制代码

 

作者: 阿凡卢
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
http://www.cnblogs.com/luxiaoxun/archive/2012/08/04/2622626.html
相关文章
|
12月前
|
存储 缓存 自然语言处理
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
KV缓存是大语言模型(LLM)处理长文本的关键性能瓶颈,现有研究多聚焦于预填充阶段优化,忽视了解码阶段的重要性。本文提出SCOPE框架,通过分离预填充与解码阶段的KV缓存策略,实现高效管理。SCOPE保留预填充阶段的关键信息,并在解码阶段引入滑动窗口等策略,确保重要特征的有效选取。实验表明,SCOPE仅用35%原始内存即可达到接近完整缓存的性能水平,显著提升了长文本生成任务的效率和准确性。
629 3
SCOPE:面向大语言模型长序列生成的双阶段KV缓存优化框架
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
554 4
|
Kubernetes 调度 数据中心
K8S 集群 NameSpace(命名空间)_NameSpace 介绍及查看 | 学习笔记
快速学习 K8S 集群 NameSpace(命名空间)_NameSpace 介绍及查看
1305 0
K8S 集群 NameSpace(命名空间)_NameSpace 介绍及查看 | 学习笔记
|
机器学习/深度学习 存储 自然语言处理
EasyNLP带你玩转CLIP图文检索
本文简要介绍CLIP的技术解读,以及如何在EasyNLP框架中玩转CLIP模型。
|
1天前
|
数据采集 人工智能 安全
|
10天前
|
云安全 监控 安全
|
2天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
906 150
|
15天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1643 8