堆排序的是集合了插入排序的单数组操作,又有归并排序的时间复杂度,完美的结合了2者的优点. 堆的定义 n个元素的序列{k1,k2,…,kn}当且仅当满足下列关系之一时,称之为堆. 情形1:ki <= k2i 且ki <= k2i+1 (最小化堆或小顶堆) 情形2:ki >= k2i 且ki >= k2i+1 (最大化堆或大顶堆) 其中i=1,2,…,n/2向下取整; 若将和此序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个完全二叉树,则堆的含义表明,完全二叉树中所有非终…
题干: 有 N 名工人. 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] . 现在我们想雇佣 K 名工人组成一个工资组.在雇佣 一组 K 名工人时,我们必须按照下述规则向他们支付工资: 对工资组中的每名工人,应当按其工作质量与同组其他工人的工作质量的比例来支付工资.工资组中的每名工人至少应当得到他们的最低期望工资.返回组成一个满足上述条件的工资组至少需要多少钱. 看完题干第一反应是个贪心题,先算出所有员工的性价比wage/quality,最后的结果必然是某个…
1.优先级队列介绍 1.1 优先级队列 有时在调度任务时,我们会想要先处理优先级更高的任务.例如,对于同一个柜台,在决定队列中下一个服务的用户时,总是倾向于优先服务VIP用户,而让普通用户等待,即使普通的用户是先加入队列的. 优先级队列和普通的先进先出FIFO的队列类似,最大的不同在于,优先级队列中优先级最高的元素总是最先出队的,而不是遵循先进先出的顺序. 1.2 堆 优先级队列的接口要求很简单.从逻辑上来说,向量.链表或者平衡二叉搜索树等数据结构都可用于实现优先级队列.但考虑到时间和空间的效率…
有时候我们需要在某个元素集合中找到最小值和最大值 .优先级队列抽象数据(Priority Queue ADT)模型是我们能够使用的方法之一,这是一种支持插入和删除最小值(DeleteMin)或者最大值(DeleteMax)的数据结构. 这两个操作和队列中的进队(EnQueue)和出队(DeQueue)操作很相似.区别就在于,在优先级队列中,数据进入的顺序与他们接受处理的顺序可能不同.就像工作日程,一般是按重要程度排序而不是到来顺序. 在优先级队列中,如果最小的元素总是优先级最高(即最小元素先出列…
由于优先级队列的内部数据结构为 堆,所以这里先介绍堆的一些操作. 堆的一些函数操作在algorithm头文件中 //在[first, last)范围内构造最大堆,first,last 可以是vector指针也可以是数组指针 make_heap(first ,last) make_heap(first ,last, cmpObject) 默认情况下是建立最大堆,即首元素为两个地址间的最大值.默认为less<int>,可以改为greater<int>即为建立最小堆 pop_heap(f…
package code.test; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; /** * 实验表明,在java中: * 1.toString()方法或迭代元素:优先级队列打印或者迭代,得到的输出顺序都为堆结构数组的顺序,大致有序但不完全保证顺序 * 2.使用poll()方法:元素整体有序,但由于堆排序是不稳定排序,…
优先级队列 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构 最简单的优先级队列可能就是一堆不同大小的数组成的队列,每次需要取出其中最小或最大的数,这是我们可以把这些数本身的大小叫做他们的优先级. 实现的想法 最简单的想法是:我们用一个元组来表示元素和它的优先级,将所有的元组都放到列表中存储,接下来当想要找到其中优先级最小的元组时会有以下两种方式…
一.heap heap并不属于STL容器组件,它分为 max heap 和min heap,在缺省情况下,max-heap是优先队列(priority queue)的底层实现机制.而这个实现机制中的max-heap实际上 是以一个vector表现的完全二叉树(complete binary tree).STL在<algorithm.h>中实现了对 存储在vector/deque 中的元素进行堆操作的函数,包括make_heap, pop_heap, push_heap, sort_heap,对…
import heapq class PriorityQueue: def __init__(self): self._queue=[] self._index=0 def push(self,item,priority): heapq.heappush(self._queue,(-priority,self._index,item)) self._index+=1 def pop(self): return heapq.heappop(self._queue)[-1] class Item:…
议题:基于堆的优先级队列(最大堆实现) 分析: 堆有序(Heap-Ordered):每个节点的键值大于等于该节点的所有孩子节点中的键值(如果有的话),而堆数据结构的所有节点都按照完全有序二叉树 排.当使用数组存储这种数据结构时,在数组大小限制和堆大小限制下,如果当前节点下标为i,其父亲节点下标为i/2,左右孩子结点下标分别为 2i,2i+1(如果计算值没有超出队列大小范围): 使用堆有序完全二叉树(Complete Binary Tree)表示优先队列,所有操作即使最坏情况下的运行时间也只是对数…