【数据结构】【模板】哈夫曼树

news/2024/11/16 19:57:00/文章来源:https://www.cnblogs.com/Yuan-Jiawei/p/18350486

哈夫曼树

定义

带权路径长度:结点的权值乘以结点到跟的距离。

树上所有结点带权路径长度之和最小的二叉树称为哈夫曼树。

性质

  1. 哈夫曼是满二叉树。
    来自维基百科:
    image
  2. 原序列构成哈夫曼树的所有叶子结点。
  3. 离根结点越近,点权越大。
  4. 非叶子结点的点权之和就是所有叶子结点的带权路径之和。
  5. 哈夫曼树的叶子结点数量为 \(n\),则总结点数为 \(2n - 1\)

建树

构建圆点和方点,圆点代表权值,方点用来建树。

每个方点连接 1 个方点和 1 个圆点或者两个方点,\(n - 1\) 个方点将 \(n\) 个点连接起来,权值为其子节点的权值之和。

构建出来的树要求权值之和最小。

代码实现

最开始时先将所有权值放入优先队列,然后从中取出 2 个点并重新将这两个点的权值之和放入优先队列,这就完成一次方点连接。

模板

模板:P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G

其实这也不能算模板

#include <bits/stdc++.h>using namespace std;const int N = 10010;int n;
priority_queue<int, vector<int>, greater<int>> pq;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cin >> n;for (int i = 1; i <= n; i++) {int x;cin >> x;pq.push(x);}int ans = 0;while (pq.size() > 1) {int p1= pq.top();pq.pop();int p2 = pq.top();pq.pop();pq.push(p1 + p2);ans += p1 + p2;}cout << ans << '\n';return 0;
}

哈夫曼编码

应用

减少字符串存储需要的空间。

统计一个字符串中每个字符出现的次数,将其作为每个字母的权值,然后建成哈夫曼树。

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

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

相关文章

线性筛法

接到主的任务,要求找出来 \([1, n]\) 中的质数。 并被告知 \(n = 10\)。 考虑 \(1\)。 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\) 是不是质数 \(1\…

解决uwsgi -ini uwsgi.ini 重启服务无效果

更新了前端代码,重启服务无效果 具体log日志 your processes number limit is 95696 your memory page size is 4096 bytes *** WARNING: you have enabled harakiri without post buffering. Slow upload could be rejected on post-unbuffered webservers ***detected max f…

「代码随想录算法训练营」第三十四天 | 动态规划 part7

198. 打家劫舍题目链接:https://leetcode.cn/problems/house-robber/ 文章讲解:https://programmercarl.com/0198.打家劫舍.html 题目难度:中等 视频讲解:https://www.bilibili.com/video/BV1Te411N7SX 题目状态:有点思路但不全。思路: 这次的dp[i]数组表示在到第i个房间…

洛谷 P2731 骑马修栅栏 Riding the Fences之欧拉路径板子

洛谷P2731题解传送锚点摸鱼环节 [USACO3.3] 骑马修栅栏 Riding the Fences 题目背景 Farmer John 每年有很多栅栏要修理。他总是骑着马穿过每一个栅栏并修复它破损的地方。 题目描述 John 是一个与其他农民一样懒的人。他讨厌骑马,因此从来不两次经过一个栅栏。 John 的农场上…

运用Npcap库实现SYN半开放扫描

Npcap 是一款高性能的网络捕获和数据包分析库,作为 Nmap 项目的一部分,Npcap 可用于捕获、发送和分析网络数据包。本章将介绍如何使用 Npcap 库来实现半开放扫描功能。TCP SYN 半开放扫描是一种常见且广泛使用的端口扫描技术,用于探测目标主机端口的开放状态。由于这种方法并…

js模拟Sleep/Delay

原文链接 https://www.51cto.com/article/767574.html 我的总结 看上去比较好的方式: 1.用递增的setTimeOut。 2.用async/await。 最后结论截图 翻译 搜索 复制

支付三大黑盒之二支付引擎

支付系统有三大黑盒“清结算对账、支付引擎和账务系统”,之所以说是黑盒一来是因为他们深藏后台很少被人看到,二来是有会计知识的门槛。这篇文章就用尽可能大白话的语言来介绍三个黑盒之一的“支付引擎”。 一、什么是支付引擎 支付引擎又被称为支付核心,他是支付系统的后台…

你觉得大模型时代该出现什么?

大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么我们期待的结果都没出现呢?咱们先一起回顾下历史。大模型的概念都火了两年了,之前各种媒体吹嘘大模型的出现是类似“蒸汽机时代”、“iPhone时刻”等等。那为什么…

鸿蒙(HarmonyOS)实现隐私政策弹窗

在实现用户协议弹窗时,通常我们会想到使用系统自定义弹窗,并在弹窗中点击跳转到Web页面。但在HarmonyOS中,由于系统弹窗的显示优先级高于其他组件,即使跳转到Web页面,弹窗依然会显示在最上层。 为了解决这个问题,我们可以自定义一个组件来模拟弹窗,这样当跳转到Web页面时…

软件测试常见术语-几万万人的钉钉、微信软件测试群

3 术语和定义 在本文档中,以下术语和定义适用。 ISO、IEC 和 IEEE 在以下地址维护标准化中使用的术语数据库:ISO 在线浏览平台:https://www.iso.org/obp/ui IEC 电子百科全书:网址:https://www.electropedia.org/ IEEE 在线标准词典:https://ieeexplore.ieee.org/browse/…

dotnet C# 分享基础 for 循环的写法

本文将来和大家聊聊在 dotnet C# 里面的基础的 for 循环语法的写法使用 for 作为循环的写法是在编程里面常用的代码写法。比如说我有一个名为 Foo 的类型,这个类型提供了一个名为 GetCount 的方法,这个方法可以缓慢的获取 Foo 里面的一个代表数量的值。且在 Foo 类型里面提供…