HuffmanTree

简介: HuffmanTree

例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下:


 1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。


 2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。


 3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。


 4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。


 5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。

*/
#include <stdlib.h>
#include <iostream>
using namespace std;
typedef struct node{
      struct node *left;
      struct node *right;
      int weight;
      char data;
}Huff;
class Huffm{
      private:
           Huff **F;
           int n;
           Huff *root;
    public:
         Huffm(int *pi,int n){
         Huff *p=NULL;
            F=(Huff **)malloc(sizeof(Huff *));
                   for(int i=0;i < n ;i++){
                p=(Huff *)malloc(sizeof(Huff));
                p->left=p->right=NULL;
                p->weight=pi[i];
                p->data='a'+i;
                F[i]=p;
            }//for
            this->n=n;
         }
        void  BuiltHuff();//建树
        Huff *gettree();//返回头结点
        void Printree(Huff *tree);//层遍历输出整棵树
};
int main(void)
{
      int pi[]={5,3,8,2,9};
      Huffm *tree=new Huffm(pi,5);
      tree->BuiltHuff();
      Huff *root=tree->gettree();
      tree->Printree(root);
      return 0;
}
void Huffm::BuiltHuff()
{
      Huff *p=NULL;
      int k1,k2;
      for(int i=0;i<n-1;i++){
      //最小次小
           for(k1=0;!F[k1];k1++);
           for(k2=k1+1;!F[k2];k2++);
           for(int j=k2;j<n;j++){
                 if(F[j]){
                      if(F[j]->weight<F[k1]->weight){
                            k2=k1;
                            k1=j;
                      }else if(F[j]->weight<F[k2]->weight){
                            k2=j;
                      }
                 }/*if F[j] */
           }/*for j*/
           //建树
            p=(Huff *)malloc(sizeof(Huff));
            p->data=0;
            p->left=F[k1];
            p->right=F[k2];
            p->weight=F[k1]->weight+F[k2]->weight;
            F[k1]=p;
            F[k2]=NULL;
      }/*for i*/
      this->root=F[k1];
}
Huff *Huffm::gettree()//返回头结点
{
      return root;
}
void Huffm::Printree(Huff *tree)//层遍历输出整棵树
{
   Huff **p=(Huff **)malloc(sizeof(Huff *));
   Huff *pnode=NULL;
   int head=0,tail=0;
   p[++tail]=tree;
   while(tail!=head){
   head=(head+1)%5;
   cout<<p[head]->weight<<p[head]->data<<" ";
   pnode=p[head];
   if(pnode->left){
             tail=(tail+1)%5;
             p[tail]=pnode->left;
   }
   if(pnode->right){
             tail=(tail+1)%5;
             p[tail]=pnode->right;
   }
   }
}
相关文章
《数字逻辑设计与计算机组成》一 2.2 逻辑表达式
本节书摘来自华章出版社《数字逻辑设计与计算机组成》一 书中的第2章,第2.2节,作者:[美]尼克罗斯·法拉菲,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3194 0
|
2天前
|
Kubernetes 测试技术 应用服务中间件
基于 Nginx Ingress + 云效 AppStack 实现灰度发布
本文将演示结合云效 AppStack,来看下如何在阿里云 ACK 集群上进行应用的 Ingress 灰度发布。
64261 8
|
7天前
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
123228 17
|
9天前
|
存储 SQL 搜索推荐
一站式实时数仓Hologres整体能力介绍—2024实时数仓Hologres公开课 01
一站式实时数仓Hologres整体能力介绍—2024实时数仓Hologres公开课 01
|
8天前
|
存储 运维 安全
Greenplum闭源?平滑迁移到 AnalyticDB 开启Data+AI新范式
知名开源 MPP 数据库 Greenplum 由于其丰富的企业级特性和出色的数据处理能力成为很多企业构建数仓的首选。近期 GP 公开 Github 仓库无法访问仅保留只读归档代码,业界纷纷猜测 GP 即将闭源。云原生数仓 AnalyticDB PostgreSQL 版完全掌控内核代码,完全兼容GP语法,全自研计算及存储引擎较比开源GP有五倍性能提升,全自研企业级特性在实时计算、弹性扩展、安全增强、高可用等方面实现对GP的全面超越,并在数仓能力上扩展了向量检索及一站式 RAG 服务,帮助企业快速构建 AI 应用、开启 Data+AI 新范式。
58819 1
|
10天前
|
搜索推荐 API 对象存储
10分钟学会构建端到端的图片搜索服务
本文介绍在没有向量数据的情况下,怎样通过OpenSearch-向量检索版快速从零搭建图像搜索服务。
81427 67
|
9天前
|
存储 弹性计算 数据可视化
高效、弹性,阿里云工业仿真行业解决方案解读
近日,全球领先的云计算厂商阿里云宣布最新HPC优化实例hpc8ae的正式商业化,该实例依托阿里云自研的「飞天+CIPU」架构体系,搭载第四代AMD EPYC处理器,专为高性能计算应用优化,特别适用于计算流体、有限元分析、多物理场模拟等仿真类应用,CAE场景下的性价比最少提升50%。
|
13天前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
146182 18
|
11天前
|
Oracle 关系型数据库 分布式数据库
PolarDB助力欧派家居核心系统去O上云,每秒处理万次事务
欧派家居选择阿里云PolarDB-PG数据库,因其顺应云趋势,提供稳定服务,提升扩容和运维效率。欧派运维负责人表示,PolarDB-PG云上运行优于自建Oracle,云运维响应更快,解决问题效率更高。
|
11天前
|
SQL 存储 运维
Flink⼤状态作业调优实践指南:Flink SQL 作业篇
本文整理自俞航翔、陈婧敏、黄鹏程老师所撰写的大状态作业调优实践指南。由于内容丰富,本文中篇内容分享 Flink SQL 作业大状态导致反压的调优原理与方法。
68933 6
Flink⼤状态作业调优实践指南:Flink SQL 作业篇

热门文章

最新文章