首页 > 其他分享 >【数据结构】【模板】哈夫曼树

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

时间:2024-08-10 09:38:46浏览次数:9  
标签:结点 pq 哈夫曼 int 方点 权值 数据结构 模板

哈夫曼树

定义

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

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

性质

  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;
}

哈夫曼编码

应用

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

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

标签:结点,pq,哈夫曼,int,方点,权值,数据结构,模板
From: https://www.cnblogs.com/Yuan-Jiawei/p/18350486

相关文章

  • 网页设计模板范例
    随着互联网的发展,网页设计变得越来越重要。一个吸引人的网页设计可以吸引更多的用户,提升用户体验,并且使网站内容更加易于浏览和理解。在这篇文章中,我将为大家介绍一个网页设计模板范例。1.选择合适的颜色和字体:一个好的网页设计应该有一个统一的颜色和字体方案。首先,选择主......
  • 问题 E: 数据结构基础5-车厢调度
    题目描述有一个火车站,铁路如图所示,每辆火车从A驶入,再从B方向驶出,同时它的车厢可以重新组合。假设从A方向驶来的火车有n节(n<=1000),分别按照顺序编号为1,2,3,…,n。假定在进入车站前,每节车厢之间都不是连着的,并且它们可以自行移动到B处的铁轨上。另外假定车站C可以停放任意多节车厢。......
  • Meissel_Lehmer模板
    复杂度\(O(n^\frac23)\),计算\(1\simn\)的素数个数#definediv(a,b)(1.0*(a)/(b))#definehalf(x)(((x)-1)/2)i64Meissel_Lehmer(i64n){if(n<=3){returnmax(n-1,0LL);}longlongv=sqrtl(n);ints=(v+1)/2......
  • 模板 - 二分&三分
    二分&三分整数二分intBinarySearch(constintL,constintR){ intl=L-1,r=R+1; while(l+1<r) { intmid=l+r>>1; if(check(mid))l=mid; elser=mid; } returnl;}浮点数二分constdoubleEPS=1e-6;doubleBinarySearch(constdoubleL,constdouble......
  • 模板 - 数据结构
    链表定义structPeter{ intval; intnxt,pre;}node[M];intidx=0;初始化inlinevoidInit()//head:0;tail:n+1{ node[0]={0,n+1,0}; node[n+1]={0,n+1,0}; return;}在p后插入valinlinevoidinsert(intp,intval){ node[++idx]={val,node[p].nxt,p}; ......
  • 【C++】模板(相关知识点讲解 + STL底层涉及的模板应用)
    目录模板是什么?模板格式模板本质函数模板格式介绍显式实例化模板参数匹配原则类模板类模板的实例化非类型模板参数模板特化——概念函数模板特化类模板的特化全特化半特化偏特化三种类特化例子(放一起比较)模板分离编译STL中比较经典的模板应用(不包含argus)......
  • 移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——4.模板
    1.泛型编程如何实现一个通用的交换函数呢?voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right){doubletemp=left;left=right;right=temp;}voidSwap(char&left,char&right)......
  • 【数据结构】关于栈你必须知道的内部原理!!!
    前言:......
  • redis数据结构
    redis数据类型 stringlisthashsetzsetHyperLogLogGEOBloomFilter(布隆过滤器)HyperLogLog基本概念:Redis在2.8.9版本添加了HyperLogLog结构。RedisHyperLogLog是用来做基数统计的算法,所谓基数,也就是不重复的元素。优点在输入元素的数量或者体积非常......
  • 数据结构之二叉树的顺序存储结构与链式存储结构
    一、顺序存储结构1.定义与特点顺序存储结构是指用一组地址连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素。完全二叉树和满二叉树采用顺序存储比较合适,因为它们的结点序号可以唯一地反映结点之间的逻辑关系,从而既能最大地节省存储空间,又能利用数组元......