首页 > 其他分享 >Huffman

Huffman

时间:2023-08-12 16:13:04浏览次数:21  
标签:权重 int ll 叶子 include Huffman 节点

问题:构造一颗包含 \(n\) 个叶子节点的 \(k\) 叉树,第 \(i\) 个叶子节点深度 \(d_i,\) 权重\(w_i,\)使\(\sum\limits_{i=1}^nd_i*w_i\)最小
直观考虑:要使得权重大的在上面,权重小的在下面
因为对于一个叶子节点,他的贡献是他的权重*他到根的路径节点数,不妨使树转化为:
对每个叶子节点,使得他和根节点之间的所有节点(除去自己)都加上这个叶子结点的权重,就可以把贡献分摊到所有节点上
这样最终的总和就是所有节点的和
于是就有了一个贪心策略:
\(1.\) 建立小根堆,插入所有节点
\(2.\) 找到 \(k\) 个权重最小的节点,新加入一个节点,权重为他们之和
\(3.\) 重复 \(2\) 操作,直到堆的大小为 \(1\)

但是这个算法有一个\(bug:\)可能在深度为2时节点的数量已经不足\(k\)个
这样浪费了深度为\(2\)的空间,显然不是最小的构造

怎么解决?

肯定要使最底下一层的一些节点变成空,于是想到加入 \(0\) 元素,使得叶节点数 \(n\) 满足\((n-1)\%(k-1)=1\)

NOI2015 荷马史诗:

条件是没有一个字符串是另一个字符串的前缀,其实就是Huffman
最长\(s_i\)最短的限制?如果有两个相同的元素优先使用当前深度较小的元素

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std ;

typedef long long ll ;
const int N = 100100 ;

struct node {
	ll w ; int tim ;
};

bool operator <(node a, node b) {
	if (a.w != b.w) return a.w > b.w ;
	else return a.tim > b.tim ;
}

priority_queue <node> q ;
int n, k ;
ll ans ;
ll w[N] ;

int main() {
	scanf("%d%d", &n, &k) ;
	for (int i = 1; i <= n; i++) scanf("%lld", &w[i]) ;
	while ((n - 1) % (k - 1) != 0) w[++n] = 0 ;
	for (int i = 1; i <= n; i++) q.push((node){w[i], 0}) ;
	while (q.size() != 1) {
		int mxt = 0 ; ll sum = 0 ;
		for (int i = 1; i <= k; i++) {
			sum += q.top().w ; mxt = max(mxt, q.top().tim) ;
			q.pop() ;
		}
		q.push((node){sum, mxt + 1}) ;
		ans += sum ;
	}
	printf("%lld\n%d\n", ans, q.top().tim) ;
}

标签:权重,int,ll,叶子,include,Huffman,节点
From: https://www.cnblogs.com/lighthqg/p/17624946.html

相关文章

  • Huffman树
    引入Huffman树:设一棵二叉树具有\(n\)个带权结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之和称为树的带权路径长度(WPL)设\(w_i\)为二叉树第\(i\)个叶结点的权值,\(h_i\)为从根结点到第\(i\)个叶结点的路径长度,则有\[WPL=\sum_{i=1}^{n}w_i\timesh_i......
  • 哈夫曼树(Huffman Tree)的基本概念介绍
    哈夫曼树(HuffmanTree)是一种常用的数据结构,用于实现数据压缩和编码。它是由美国计算机科学家DavidA.Huffman于1952年提出的,被广泛应用于通信、压缩算法和信息存储等领域。哈夫曼树主要用于根据字符出现的频率构建最优的前缀编码,以便在压缩数据时能够有效地减少所需的比特数。该......
  • 赫夫曼树HuffmanTree
    赫夫曼树HuffmanTree1.基本概念路径:在树中,从一个节点到另外一个节点之间的分支构成这两个节点之间的路径;路径长度:路径上的分支数称为路径长度;若规定根节点的层数为1,则从根节点到第L层节点的路径长度为L-1;节点的权:对树中的节点赋一个具有某种含义的数值,则该数值称为该......
  • Huffman实现
    Huffman编码树秒懂:【算法】Huffman编码_哔哩哔哩_bilibili约定:字符x的编码长度就是其对应叶节点的深度;在一个字符集中,每个字符出现的次数有多有少,那么若都采用固定长度编码的话,那么编码长度会非常大,并且搜索时间复杂度都非常高;若采用非固定编码,出现次数多的字符编码长度小一......
  • 算法学习笔记(52)——Huffman树
    Huffman树题目链接:AcWing148.合并果子利用贪心的思想,每次从当前所有堆中,挑出最小的两堆合并即可。#include<iostream>#include<algorithm>#include<queue>usi......
  • huffman编译码
    1.算法描述        利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编......
  • huffman编译码
    1.算法描述利用哈夫曼编码进行信息通信可以较大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来......
  • SICP:符号求导、集合表示和Huffman树(Python实现)
    绪论到目前为止,我们已经使用过的所有复合数据,最终都是从数值出发构造起来的(比如我们在上一篇博客《SICP2.2:层次性数据和闭包性质(Python实现)》所介绍的链表和树就基于......
  • 『题解』UVA 240 Variable Radix Huffman Encoding
    题目传送门题意哈夫曼编码是一种最优编码方法。根据已知源字母表中字符出现的频率,将源字母表中字符编码为目标字母表中字符,最优的意思是编码信息的平均长度最小。在该问......
  • 『题解』UVA 12676 Inverting Huffman
    题目传送门题意静态哈夫曼编码是一种主要用于文本压缩的编码算法。给定一个由\(N\)个不同字符组成的特定长度的文本,算法选择\(N\)个编码,每个不同的字符一个编码。使......