优先队列

优先队列&最大堆

半腔热情 提交于 2020-03-16 20:21:21
1. 采用什么数据结构存储 普通非顺序线性结构 添加数据 O(1) 获取元素 O(n) 利用树形结构,实现一个堆 父元素比左右子树元素的值都大 堆的节点层次不能决定他的大小(不一定层次越低值越大)、 最大堆是一个完全二叉树 2.最大堆的实现-数组 用数组实现可以不使用0号位置 parentIdex = i / 2 leftChild = i / 2 rightChild = i / 2 + 1 2.1 利用自定义数组实现存储 此处可替换为原生数组 public class MaxHeap < E extends Comparable < E > > { private Array < E > data ; public MaxHeap ( int capacity ) { data = new Array < > ( capacity ) ; } public MaxHeap ( ) { data = new Array < > ( ) ; } // 返回堆中的元素个数 public int size ( ) { return data . getSize ( ) ; } // 返回一个布尔值, 表示堆中是否为空 public boolean isEmpty ( ) { return data . isEmpty ( ) ; } // 返回完全二叉树的数组表示中

序列合并(优先队列)

折月煮酒 提交于 2020-03-16 04:49:22
洛谷题目链接: 序列合并 题目描述 有两个长度都是N的序列A和B,在A和B中各取一个数相加可以得到 N 2 个和,求这 N 2 个和中最小的N个。 输入输出格式 输入格式: 第一行一个正整数N; 第二行N个整数 A i ​ , 满足 A i ≤A i+1 且 A i ≤10 9 ; 第三行N个整数 B i ​ , 满足 B i ≤B i+1 且 B i ≤10 9 . 【数据规模】 对于50%的数据中,满足1<=N<=1000; 对于100%的数据中,满足1<=N<=100000。 输出格式: 输出仅一行,包含N个整数,从小到大输出这N个最小的和,相邻数字之间用空格隔开。 输入输出样例 输入样例#1: 3 2 6 6 1 4 8 输出样例#1: 3 6 7 一句话题意: 两个长度为 n的单调递增的序列可以组成 n 2 个组合,问这些组合中最大的前n 个. 题解: 首先看一下下面这张表: A[1]+B[1] <= A[1]+B[2] <= … <= A[1]+B[N] A[2]+B[1] <= A[2]+B[2] <= … <= A[2]+B[N] …… A[N]+B[1] <= A[N]+B[2] <= … <= A[N]+B[N] 显然,在同一列中,每一行都比上面一行的值要大. 所以,我们可以先将 A 1 ~ A n 与 B 1 的值都加入堆中,每次取出了堆中的最小值

Huffman编码(Huffman树)

橙三吉。 提交于 2020-03-09 20:03:22
【0】README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 “Huffman编码(Huffman树)” 的idea 并用源代码加以实现; 0.2) Huffman树的构建算法属于 贪婪算法 , 贪婪算法的基础知识参见:   http://blog.csdn.net/pacosonswjtu/article/details/50071159 【1】Huffman 编码 1.1)贪婪算法的第二个应用: 文件压缩; 1.1.1)标准的 ASCII字符集: 它由大约100个 可打印字符组成,为了把这些字符区分开, 需要 |log100|(不小于等于log100) = 7个 比特; 1.1.2)看个荔枝:(使用一个标准编码方案) 设一个文件, 它只包含字符 a, e, i, s, t, 加上一些空格和 newline(换行)。 进一步设该文件有10个a、15个e、12个i、3个s、4个t、13个空格以及一个 newline, 如图10-8所示, 这个文件需要174个bits 来表示,因为有58个字符,每个字符3个bits; 1.2)现实中的事实: 文件可能相当大。 许多大文件是某个程序的输出数据,而在使用频率最大和最小之间的字符间通常存在很大的差别; 1.2.1)出现的问题: 是否有可能提供一种更好的编码降低总的所需bits数量 2.2)解决方法:

堆-优先队列

你离开我真会死。 提交于 2020-03-08 09:09:02
堆-优先队列 前置知识:二叉树。 参考资料 暂无 堆就是优先队列,可以用来解决动态区间查询最值问题。 堆就是一个完全二叉树,可以插入节点,删除根节点(也可以删除特定节点)。 为了方便,普通的堆节点 \(i\) 的父亲就是 \([i\div2]\) ( \([x]\) 表示不超过 \(x\) 的最大整数)。 节点 \(i\) 的左儿子是 \(i\times2\) ,右儿子是 \(i\times2+1\) 。 对于一个大顶堆: 每次插入节点的时候,就把节点插在完全二叉树的最后,如果它比它的父亲节点大,就把它和父亲交换,然后一直和父亲比较交换,直到父亲的值比它大,或者它已经成为树根。 每次删除根节点的时候,就把完全二叉树最后的那个节点放到根节点上,然后让最后那个节点原来的位置消失。然后把单前的根节点,跟它的左儿子比较,如果比左儿子小,就跟左儿子交换,然后不停跟左儿子比较交换知道它比左儿子大或着他没有左儿子。 时间复杂度 \(O(n\log n)\) 。 如果你掌握了这些,那蒟蒻就放代码了: #include <bits/stdc++.h> using namespace std; const int N=1e5+10; class heap{ public: int v[N],sz; heap(){sz=0;} void push(int x){ //插入 int p=++sz; for

Flowers(priority_queue优先队列)(pta)

浪子不回头ぞ 提交于 2020-03-08 00:03:22
Recently Jack becomes much more romantic. He would like to prepare several bunches of flowers. Each bunch of flowers must have exactly M flowers. As Jack does not want to be boring, he hopes that flowers in the same bunch are all different species. Now there are N species of flowers in the flower shop, and the number of the i-th species of flower is a​i​​. Now Jack would like to know how many bunches of flowers he can prepare at most. (Flowers are used to propose.) Input The first line contains an integer T (1≤T≤10) --- the number of test cases. In the first line of each test case, there are

堆与优先队列

非 Y 不嫁゛ 提交于 2020-03-06 18:12:28
目录 堆Heap 二叉堆 Binary Heap 1. 最大堆的实现: 2. 添加元素 O(logn) 上浮 siftUp() 3. 堆元素的取出 O(logn) 下沉 siftDown() 4. heapify O(n) 5. replace 优先队列 topK 问题 扩展: 1. d 叉堆 (d-aray heap) : 2. 索引堆: 3. 二项堆: 4. 斐波那契堆: 5. 广义队列 堆Heap 二叉堆 Binary Heap 满二叉树:除了叶子节点,其他所有节点 左右孩子均不为空 性质: 二叉堆是一棵 完全二叉树 ( 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(x层:2^(x-1)个),第 h 层 所有的结点都连续集中在最左边 ,这就是完全二叉树 ) 二叉堆是 最大堆 (堆中某个节点的值总是 不大于其父节点的值 )。即根节点的元素是 最大 的。(从堆中去除元素只能取 堆顶 的元素) 可以将这个 二叉堆(最大堆) 用 数组 来表示。一层一层元素从左往右放入数组。 1. 最大堆的实现: 用 数组 来实现 private Array<E> data; public MaxHeap(int capacity){ data = new Array<>(capacity); } //将数组直接传入转换为最大堆 public MaxHeap

priority_queue优先队列/C++

淺唱寂寞╮ 提交于 2020-03-06 07:12:05
priority_queue优先队列/C++ 概述   priority_queue是一个拥有权值观念的queue,只允许在底端加入元素,并从顶端取出元素。   priority_queue带有权值观念,权值最高者,排在最前面。   缺省情况下priority_queue系利用一个max-heap完成,后者是一个以vector表现的complete binary tree。 定义   由于priority_queue完全以底部容器为根据,再加上heap处理规则,所以其实现非常简单。缺省情况下是以vector为底部容器。   priority_queue的所有元素,进出都有一定的规则,只有queue顶端的元素(权值最高者),才有机会被外界取用。priority_queue不提供遍历功能,也不提供迭代器。   底部用到了:make_heap,push_heap,pop_heap(三个都是泛型算法) push_heap: 先利用底层容器的push_back()将新元素推入末尾,再重排heap。 pop_heap: 从heap内取出一个元素。它并不是真正将元素弹出,而是重排heap,然后再以底层容器的pop_back()取得被弹出的元素。 template< class T, class Container = std::vector<T>, class Compare = std:

优先队列priority_queue 用法详解

泪湿孤枕 提交于 2020-03-06 07:10:20
http://www.cnblogs.com/void/archive/2012/02/01/2335224.html 优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。 例如:我们常用的操作就是对数据排序, 优先队列默认的是数据大的优先级高 所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。 用法: 示例:将元素5,3,2,4,6依次push到优先队列中,print其输出。 1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。 priority_queue<int> pq; 通过<操作符可知在整数中元素大的优先级高。 故示例1中输出结果为: 6 5 4 3 2 2. 数据越小,优先级越高 priority_queue<int, vector<int>, greater<int> >pq; 其中 第二个参数为容器类型。 第二个参数为比较函数。 故示例2中输出结果为:2 3 4 5 6 3. 自定义优先级,重载比较符号 重载默认的 < 符号 struct node{ friend bool operator< (node n1, node n2) { return n1

优先队列STL

蓝咒 提交于 2020-03-01 03:06:57
Training 2 - C题 You are given an array of n integer numbers a0, a1, …, an - 1. Find the distance between two closest (nearest) minimums in it. It is guaranteed that in the array a minimum occurs at least two times. Input The first line contains positive integer n (2 ≤ n ≤ 105) — size of the given array. The second line contains n integers a0, a1, …, an - 1 (1 ≤ ai ≤ 109) — elements of the array. It is guaranteed that in the array a minimum occurs at least two times. Output Print the only number — distance between two nearest minimums in the array. Examples Input 2 3 3 Output 1 Input 3 5 6 5

星球人口——优先队列(C++)

牧云@^-^@ 提交于 2020-02-25 01:49:00
题目: XX统治了N颗星球,其中第i颗星球上现在有Ai人口。每年每颗星球的人口都会增长K亿。从现在开始,每过100年,XX会挑选一颗人口最多的星球,消灭(假设当时该星球有X亿人口,将只剩下⌊X/2⌋亿人口) 请你计算现在经过了M个100年之后,这N颗星球总计还有多少亿人口。 IN: 第一行包含3个整数N, M和K。 第二行包含N个整数,A1, A2, ... AN。 1 <= N, M <= 100000 1 <= K <= 100 1 <= Ai <= 100000 OUT: 一个整数代表答案 解法一:数组输入(vector),sort排序 #include <bits/stdc++.h> using namespace std; bool cmp(int a,int b) { return a>b; } const int maxsize=1e6+6; int p[maxsize]; int main() { int n,m,k; long long sum=0; scanf("%d%d%d",&n,&m,&k); for(int i=0;i<n;i++) scanf("%d",&p[i]); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) p[j]+=k*100; sort(p,p+n,cmp); p[0]/=2; } for(int