【C++算法】构建最优哈夫曼树

【C++算法】构建最优哈夫曼树

作者:爱写代码的刚子
时间:2024.1.20
前言:本篇博客的代码均为自己独立完成,可能会有瑕疵

代码实现

#include <iostream>
#include <vector>
#include <queue>
using namespace std;template <class T>
class TreeNode
{
public:TreeNode(const T&value):_parent(nullptr),_left(nullptr),_right(nullptr),_value(value),_a(0){}TreeNode(const T&value,const int& a):_parent(nullptr),_left(nullptr),_right(nullptr),_value(value),_a(a){}TreeNode* _parent;TreeNode* _left;TreeNode* _right;T _value;int _a;};template <class T>
class Huffman_tree
{typedef TreeNode<T> Node;
public:Huffman_tree():_root(nullptr){}template<class F>struct greater{bool operator()(const F & x,const F & y) const{if(x->_value==y->_value){printf("equal\n");return x->_a>y->_a;}return x->_value>y->_value;}};void creat_Huffman_tree(vector<T> v){sort(v.begin(),v.end());priority_queue<Node* ,vector<Node* >,greater<Node*>> pq;for(auto& e:v){Node* node=new Node(e);pq.push(node);}while(!pq.empty()) {Node *left = pq.top();pq.pop();Node *right = nullptr;if (!pq.empty()) {right = pq.top();pq.pop();} else {_root = left;return;}Node *parent = new Node(left->_value + right->_value, 1);left->_parent = parent;right->_parent = parent;parent->_left = left;parent->_right = right;//test(parent);pq.push(parent);}}void Print(){Node* copy=_root;_Print(copy);cout<<"这是前序遍历\n"<<endl;}void test(Node* test){_test(test);cout<<endl;}private:Node* _root;void _Print(Node* root){if(root==nullptr){return;}cout<<root->_value<<" ";_Print(root->_left);_Print(root->_right);}void _test(Node* test){if(test==nullptr){return;}cout<<test->_value<<" ";_Print(test->_left);_Print(test->_right);}
};
int main()
{vector<int> v{19,21,32,2,3,6,7,10};vector<int> v1{3,4,5,6,7,8,9};Huffman_tree<int> hf;hf.creat_Huffman_tree(v);hf.Print();return 0;
}

思路

采用优先级队列,将数据进行插入处理。
这个代码还有优化的地方:creat_Huffman_tree(v);采用了vector的拷贝构造,可以换成迭代器直接构造。
核心函数: void creat_Huffman_tree(vector<T> v);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/636684.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea上传本地项目到gitlab

1. idea上传本地项目到gitlab 1. 配置idea里本地安装的git位置 即选择 Settings -> Version Control -> Git -> Path to Git executable 2. 在idea创建本地仓库 即选择 VCS -> Create Git Repository 然后选择目录&#xff0c;默认就是选择的当前项目&#xff…

【Linux】03 GCC编译器的使用

一、编译过程 在使用gcc编译程序时&#xff0c;编译过程可以简要划分为4个阶段&#xff1a; 预处理、编译、汇编、链接 1.1 预处理&#xff08;preprocessing&#xff09; 这个阶段主要处理源文件中的#indef、#include和#define预处理命令&#xff1b; 这里主要是把一些include…

低代码开发让量化交易插上翅膀

随着技术的不断发展&#xff0c;低代码开发平台逐渐在各个领域崭露头角。其中&#xff0c;量化交易是一个领域&#xff0c;通过低代码开发平台&#xff0c;使得量化交易策略的开发和实施更加高效、灵活和可持续。 量化交易是基于算法和数学模型的自动化交易策略&#xff0c;近年…

RT-DETR算法优化改进:DCNv4更快收敛、更高速度、更高性能,效果秒杀DCNv3、DCNv2等 ,助力检测

💡💡💡本文独家改进:DCNv4更快收敛、更高速度、更高性能,完美和RT-DETR结合,助力涨点 DCNv4优势:(1) 去除空间聚合中的softmax归一化,以增强其动态性和表达能力;(2) 优化存储器访问以最小化冗余操作以加速。这些改进显著加快了收敛速度,并大幅提高了处理速度,DC…

Linux指令(四)

1.more指令 我们知道cat指令是用来读取文本文件的&#xff0c;但是如果是大文件&#xff0c;其实是不适合cat读取的&#xff0c;原因是&#xff1a;cat读取会直接到文本的结尾&#xff0c;所以我们引入&#xff1a;more指令 该指令不会将文件直接读到结尾&#xff0c;而是将最…

Cocos creator 的事件处理(鼠标事件、键盘事件、触摸事件、自定义事件、控制精灵移动Demo)

鼠标事件 //鼠标事件this.node.on(cc.Node.EventType.MOUSE_DOWN, (e: cc.Event.EventMouse) > {cc.log(e.getLocation() "")if (e.getButton() cc.Event.EventMouse.BUTTON_LEFT) {cc.log("鼠标左键")}})键盘事件 //键盘事件cc.systemEvent.on(cc.Sy…

Python中二维数据(数组、列表)索引和切片的Bug

Python中有关数据结构索引和切片引起的Bug 一维数据索引和切片一维数组一维列表 二维数据的索引和切片二维数组二维(错误)列表 一维数据索引和切片 一维数组 对于一维数据进行索引和切片操作&#xff0c;大家都比较熟悉通过下面代码进行实现 import numpy as np data np.ra…

AP1400-2-HW1---一个c++的线性代数库

&#xff08;1&#xff09;random库&#xff08;随机数矩阵&#xff09;&#xff1a; 1. &#xff08;1&#xff09;std::random_device是一个产生非确定性随机数的类。 在大多数情况下&#xff0c;它会产生基于硬件的随机数&#xff0c;比如通过硬件噪声等方式。 &#xff…

[陇剑杯 2021]webshell

[陇剑杯 2021]webshell 题目做法及思路解析&#xff08;个人分享&#xff09; 问一&#xff1a;单位网站被黑客挂马&#xff0c;请您从流量中分析出webshell&#xff0c;进行回答&#xff1a; 黑客登录系统使用的密码是_____________。 题目思路&#xff1a; 分析题目&…

logstack 日志技术栈-02-ELK 的缺点?loki 更轻量的解决方案?

ELK/EFK日志系统 如果今天谈论到要部署一套日志系统&#xff0c;相信用户首先会想到的就是经典的ELK架构&#xff0c;或者现在被称为Elastic Stack。 Elastic Stack架构为Elasticsearch Logstash Kibana Beats的组合&#xff0c;其中&#xff0c;Beats负责日志的采集&…

多表形成树形结构

多表形成树形结构&#xff1a; package com.js.archive.assistant.domain.vo;import com.js.core.domain.vo.BaseVO; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode;import…

mysql中建立一个用户,只能看到某个指定的数据库

MySQL用户管理及权限控制 在MySQL数据库中&#xff0c;用户管理和权限控制是非常重要的功能。通过正确地设置用户和权限&#xff0c;可以保护数据库的安全性&#xff0c;防止未授权的访问和数据泄露。本文将介绍如何在MySQL中创建一个用户&#xff0c;并限制该用户只能访问特定…

假设检验:以样本服从二项分布举例

目录 假设检验一、假设检验的思想二、假设检验的基本步骤1. 确定要进行检验的假设2. 选择检验统计量3. 确定用于做决策的拒绝域4. 求出检验统计量的值5. 查看样本结果是否位于拒绝域内6. 做出决策 三、举例说明例子1——某公司治疗打鼾例子2——女士品茶的故事 假设检验 一、假…

用Photoshop来制作GIF动画

录了个GIF格式的录屏文件&#xff0c;领导让再剪辑下&#xff0c;于是用Photoshop2023&#xff08;PS版本低至CS6操作方式一样&#xff09;进行剪辑&#xff0c;录屏文件有约1400帧&#xff0c;由于我处理的帧数太多&#xff0c;PS保存为GIF格式时&#xff0c;还是挺耗时的&…

【Docker】网络配置及自定义网络的使用

一、引言 1、什么是网络配置 Docker的网络配置主要是指Docker容器与外部网络之间的连接设置&#xff0c;包括容器内部的IP地址、端口号等。Docker提供了多种网络模式&#xff0c;包括bridge、host、none等&#xff0c;以满足不同的需求。 默认情况下&#xff0c;Docker使用brid…

用Python替代Mapinfo更快查找两张表中距离最近的点

目录 一、引言 二、准备工作 三、数据准备 四、计算距离 五、筛选最近点 六、完整代码示例 七、性能优化 八、总结 一、引言 在地理信息系统&#xff08;GIS&#xff09;中&#xff0c;经常需要查找两张表中距离最近的点。传统的做法是使用Mapinfo软件&#xff0c;但这…

探索世界,从一款好用的浏览器开始!

好用的浏览器分享 在这个数字化的时代&#xff0c;浏览器已经成为了我们生活中不可或缺的工具。从浏览新闻、社交媒体到工作学习&#xff0c;我们几乎无时无刻不在与浏览器打交道。那么&#xff0c;如何选择一款好用的浏览器呢&#xff1f;今天&#xff0c;我就来为大家分享几…

C++函数指针

目录 背景定义 实例运行结果 背景 定义 函数指针是一个指向函数的指针变量&#xff0c;它可以指向某个函数的入口地址&#xff0c;使得程序可以通过该指针变量调用该函数。 实例 #include <iostream> using namespace std;/*** 函数指针 */// 定义一个函数 int add(i…

SAP ABAP 指针

SAP ABAP 指针 目录 一、FIELD SYMBOL 字段符号 1、定义2、assign分配3.分配-内表4.动态内表 二、数据引用 一、FIELD SYMBOL 字段符号 定义&#xff1a;是已经存在的数据对象的占位符或者符号名称&#xff0c;通过关键字 FIELD-SYMBOLS 定义&#xff0c;类似于指针&#x…

systemverilog/verilog文件操作

1、Verilog文件操作 Verilog具有系统任务和功能,可以打开文件、将值输出到文件、从文件中读取值并加载到其他变量和关闭文件。 1.1 、Verilog文件操作 1.1.1、打开和关闭文件 module tb; // 声明一个变量存储 file handler integer fd; initial begin // 以写权限打开一个文…