聪明的木匠 (哈夫曼树)

摘要:
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。、wn,则哈夫曼树的构造规则为[1]:将w1、w2、…,wn看成是有n棵树的森林;在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;从森林中删除选取的两棵树,并将新树加入森林;重复、步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。Q.empty()){inta,b;a=Q.top();Q.pop();ifbreak;b=Q.top();Q.pop();ans+=a+b;Q.push(a+b);}cout
假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为[1]:
(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
51nod 1117
#include <bits/stdc++.h>
using namespace std;

priority_queue<int, vector<int>, greater<int>> Q;

int main() {
	int n, input, ans = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> input;
		Q.push(input);
	}
	while (!Q.empty()) {
		int a, b;
		a = Q.top();
		Q.pop();
		if (Q.empty()) break;
		b = Q.top();
		Q.pop();
		ans += a+b;
		Q.push(a+b);
	}
	cout << ans << endl;
 	return 0;
}

Reference:

[1] 百度百科:哈夫曼树.

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu 安装Telnet服务[Java工程实践] 1.Java常用概念:Bean下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

《算法导论》

序GitHub 见solution.txt 6.1 堆6.1-1 在高度为h的堆中,最多元素为2(h+1)−1个,最少元素有 2h+1 个 6.1-3 最大堆的特性是除了根结点外的每个结点都有A[PARENT(i)]>=A[i]故,在一个最大堆的某颗子树中最大元素必然位于该子树的根上。 6.1-4 根据最大堆的性质,任何子树的子结点都小于根节点,故...

python 堆排序

# 二叉树的遍历# 对二叉树中的所有元素不重复的访问一遍# 广度优先遍历# 层序遍历# 从第一层开始,没一层从左至右遍历元素# 深度优先遍历# 假设树的根节点为D,左子树为L,右子树为R,且要求L一定在R之前,则有以下遍历方式:# 前序遍历:也叫先序遍历,也叫先根遍历,DLR# 中序遍历:也叫中根遍历,LDR# 后序遍历:也叫后...

redis的zset结构跳表

一、数据结构与算法——跳表 什么是跳表 跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法...

数据结构(一)树

树 是由n≥0 个结点组成的有穷集合以及结点之间关系组成的集合构成的结构,是一种一对多的数据结构。   特点: 1. 有且仅有一个结点没有前驱结点,该结点为树的根结点。 2. 除了根结点外,每个结点有且仅有一个直接前驱结点。 3. 包括根结点在内,每个结点可以有多个后继结点。 树的术语: 1. 结点的度:该结点拥有的子树的数目。 2. 树的度:树中结点度...

Oracle树查询,start with connect by prior 递归查询用法(转载)

本人觉得这个写的真不错,实用性强,就转载过来了 这个子句主要是用于B树结构类型的数据递归查询,给出B树结构类型中的任意一个结点,遍历其最终父结点或者子结点。 先看原始数据: 1 create table a_test 2 ( parentid varchar2(10), 3 subid varchar2(10)); 4 5 ins...

(考研)(精华)二叉树的知识结构图以及各种特殊的二叉树

关于二叉树有一点需要注意:二叉树并不是树的一种特殊形式。 二叉树又有几种特殊的形式:二叉排序树(二叉查找树)、最优二叉树(哈弗曼树)、二叉堆(大顶堆,小顶堆)等。斜线是数据结构 二叉排序树(二叉查找树)(BST)它或者是一棵空树;或者是具有下列性质的二叉树:(常用二分查找)1,若左子树不空,则左子树上所有结点的值均小于它的根结点的值;2,若右子树不空,则...