优先队列

数据结构(Java语言)——BinaryHeap简单实现

ぐ巨炮叔叔 提交于 2019-12-17 03:35:25
优先队列priority queue是同意至少下列两种操作的数据结构:insert插入以及deleteMin(删除最小者),它的工作是找出,返回并删除优先队列中最小的元素。insert操作等价于enqueue入队。而deleteMin则是dequeue出队在优先队列中的等价操作。 一种实现优先队列的方法是使用二叉堆binary heap,它的使用对于优先队列的实现相当普遍,以至于当堆heap这个词不加修饰地用在优先队列的上下文中时,一般都是指数据结构的这样的实现。在本节。我们把二叉堆仅仅叫做堆。像二叉查找树一样,堆也有两个性质,即结构性和堆序性。恰似AVL树,对堆的一次操作可能破坏这两个性质中的一个。因此,堆得操作必须到堆得全部性质都被满足时才干终止。其实这并不难做到。 堆是一棵被全然填满的二叉树,有可能的例外是在底层。底层上的元素从左到右填入。这种树称为全然二叉树。easy证明。一棵高为h的全然二叉树有2^h到2^(h+1)-1个节点。 这意味着全然二叉树的高是logN向下取整,显然它是O(logN)。 一个重要的观察发现,由于全然二叉树这么有规律,所以它能够用一个数组表示而不须要使用链。对于数组中任一位置i上的元素。其左儿子在位置2i上,右儿子在左儿子后的单元(2i+1)中,它的父亲则在位置i/2中。因此,这里不仅不须要链。并且遍历该树所须要的操作极简单

优先队列

冷暖自知 提交于 2019-12-15 16:12:08
优先队列 本文由 程序员小灰 公众号转载而来 漫画:什么是二叉堆?(修正版) 漫画:什么是堆排序? 这一次,我们来讲一讲二叉堆的另外一个应用:优先队列 队列的特点是什么? 聪明的小伙伴们都知道,是先进先出(FIFO)。 入队列: 出队列: 那么,优先队列又是什么样子呢? 优先队列不再遵循先入先出的原则,而是分为两种情况: 最大优先队列,无论入队顺序,当前最大的元素优先出队。 最小优先队列,无论入队顺序,当前最小的元素优先出队。 比如有一个最大优先队列,它的最大元素是8,那么虽然元素8并不是队首元素,但出队的时候仍然让元素8首先出队: 要满足以上需求,利用线性数据结构并非不能实现,但是时间复杂度较高,最坏时间复杂度O(n),并不是最理想的方式。 至于为什么最坏时间复杂度是O(n),大家可以思考下。 让我们回顾一下二叉堆的特性: 1.最大堆的堆顶是整个堆中的最大元素 2.最小堆的堆顶是整个堆中的最小元素 因此,我们可以用最大堆来实现最大优先队列,每一次入队操作就是堆的插入操作,每一次出队操作就是删除堆顶节点。 入队操作: 1.插入新节点 5 2.新节点5上浮到合适位置 。 出队操作: 1.把原堆顶节点10“出队” 2.最后一个节点1替换到堆顶位置 3.节点1下沉,节点9成为新堆顶 public class PriorityQueue { private int [ ] array ;

PriorityQueue

青春壹個敷衍的年華 提交于 2019-12-14 23:54:35
PriorityQueue 转自 本文github地址 Java中PriorityQueue通过二叉小顶堆实现,可以用一棵完全二叉树表示。本文从Queue接口函数出发,结合生动的图解,深入浅出地分析PriorityQueue每个操作的具体过程和时间复杂度,将让读者建立对PriorityQueue建立清晰而深入的认识。 总体介绍 前面以Java ArrayDeque 为例讲解了 Stack 和 Queue ,其实还有一种特殊的队列叫做 PriorityQueue ,即优先队列。 优先队列的作用是能保证每次取出的元素都是队列中权值最小的 (Java的优先队列每次取最小元素,C++的优先队列每次取最大元素)。这里牵涉到了大小关系, 元素大小的评判可以通过元素本身的自然顺序(*natural ordering*),也可以通过构造时传入的比较器 ( Comparator ,类似于C++的仿函数)。 Java中 PriorityQueue 实现了 Queue 接口,不允许放入 null 元素;其通过堆实现,具体说是通过完全二叉树( complete binary tree )实现的 小顶堆 (任意一个非叶子节点的权值,都不大于其左右子节点的权值),也就意味着可以通过数组来作为 PriorityQueue 的底层实现。 上图中我们给每个元素按照层序遍历的方式进行了编号,如果你足够细心

堆....

笑着哭i 提交于 2019-12-14 20:06:12
1, 我记得以前好像还想好好搞来着..... 什么大根堆什么小根堆来着? 2 抄自ppt 很多种实现优先队列的方式,最常见的就是堆。 最常见的堆就是二叉堆, C++ 中 priority_queue 定义了一个以权值为优先级的堆。 #include<queue> priority_queue < 数据类型 > q; 这样就声明了一个优先队列。 优先队列初始默认是权值大优先级高。 声明成权值小优先级高: priority_queue< int ,vector< int >,greater< int > > q; 来源: https://www.cnblogs.com/beiyueya/p/12040635.html

《算法》笔记 11 - 最小生成树

只谈情不闲聊 提交于 2019-12-13 08:37:53
最小生成树的应用 切分定理 贪心算法 加权无向图的数据结构 Prim算法 Kruskal算法 最小生成树的应用 加权图是一种为每条边关联一个权值的图模型,这种图可以表示许多应用,比如在一副航空图中,边表示航线,权值就可以表示距离或费用;在一副电路图中,边表示导线,权值就可以表示导线的长度或成本。在这些情形中,最令人感兴趣的便是如何将成本最小化。 最小生成树 就是用于在加权无向图中解决这类问题的。最小生成树相关的算法在通信、电子、水利、网络、交通灯行业具有广泛的应用。 图的 生成树 是它的一颗含有其所有顶点的无环连通子图,一副加权无向图的 最小生成树 (Minimum spanning tree)是它的一颗 权值 (树中所有边的权值之和)最小的生成树。 切分定理 图的一种 切分 是将图的所有顶点分为两个非空且不重复的集合。 横切边 是一条连接两个属于不同集合顶点的边。 通常通过指定一个顶点集并隐式地认为它的补集为另一个顶点集来指定一个切分。这样,一条横切边就是连接该集合的一个顶点和不在该集合中的另一个顶点的一条边。 切分定理 切分定理的内容为:在一副加权图中,给定任意的切分,它的横切边中的权重最小者必然属于图的最小生成树。 切分定理是最小生成树算法的理论依据。 要证明切分定理,需要知道树的两个重要性质: 用一条边连接树中的任意两个顶点都会产生一个新的环;

第11章 优先队列

拈花ヽ惹草 提交于 2019-12-10 19:04:19
优先队列的定义 优先队列也是一个以集合为基础的抽象数据类型 优先队列中的每一个元素都有一个优先级值。优先队列中元素x的优先级值记为p(x),它可以是一个实数,也可以是一个一般的全序集中的元素。优先级值用来表示该元素出列的优先级。 约定优先级值小的优先级高。亦可约定优先级值大的优先级高。 优先队列支持的基本运算有: (1)Min(H):返回优先队列H中具有最小优先级的元素。 (2)Insert(x, H):将元素x插入优先队列H。 (3)DeleteMin(H):删除并返回优先队列H中具有最小优先级的元素。 优先级树的概念 优先级树是满足下面的优先级性质的二叉树: (1)树中每一结点存储一个元素。 (2)任一结点中存储的元素的优先级值不大(小)于其儿子结点中存储的元素的优先级值即父结点的优先级不低于其儿子结点的优先级。 换句话说,越接近根的结点中的元素的优先级越高,越方便被访问,因为根最方便被访问。 相应的优先级树称为极小(大)化优先级树。 引入堆的概念并用堆来实现优先队列。 (1)堆的概念:如果一棵优先级树是一棵近似满二叉树,那么,这棵具有优先级性质的近似满二叉树(外形像堆)就叫做堆。 (2)用堆实现优先队列:Min(H)、Insert(x, H)和DeleteMin(H)运算的实现 用数组表示堆从而实现优先队列 (1) 用数组表示堆: 从1开始对堆的结点从根开始自上而下逐层

最短路径算法

陌路散爱 提交于 2019-12-09 18:09:23
单源最短路径问题 问题描述:给你一个顶点做源点,你想要知道,如何从源点到达其他所有点的最短路径。 OK,这个问题看起来没什么用。我们一般想知道的是A点到B点的最短路径,这个单源最短路径问题告诉我们A点到所有点的最短路径,会不会计算过多了呢? 有趣的是,解决A点到B点的最短路径算法不会比单源最短路径问题简单,我们所知的求A点到B点的最短路径算法就是求A点到任何点的最短路径。我们除了这样做,好像也没什么好办法了。 Dijkstra算法 基本原理: 每次新扩展一个距离最短的点,更新与其相邻的点的距离。当所有边权都为正时,由于不会存在一个距离更短的没扩展过的点,所以这个点的距离永远不会再被改变,因而保证了算法的正确性。不过根据这个原理,用Dijkstra求最短路的图 不能有负权边 ,因为扩展到负权边的时候会产生更短的距离,有可能就破坏了已经更新的点距离不会改变的性质。 适用条件与限制: 有向图 和 无向图 都可以使用本算法,无向图中的每条边可以看成相反的两条边。 用来求最短路的图中不能存在负权边。(可以利用拓扑排序检测) 算法流程: 在以下说明中,s为源,w[u,v]为点u和v之间的边的长度,结果保存在dist[] 初始化:源的距离dist[s]设为0,其他的点距离设为 正无穷大 ,同时把所有的点的状态设为没有扩展过。 循环n-1次: 在没有扩展过的点中取距离最小的点u

20191331 《信息安全专业导论》第10周学习总结

余生长醉 提交于 2019-12-08 23:01:38
20191331 《信息安全专业导论》第9周学习总结 教材学习内容总结 信息系统(Information system) 信息系统是由计算机硬件、网络和通信设备、计算机软件、信息资源、信息用户和规章制度组成的以处理信息流为目的的人机一体化系统。主要有五个基本功能,即对信息的输入、存储、处理、输出和控制。 数据库与SQL SQL是具有数据操纵和数据定义等多种功能的数据库语言,这种语言具有交互性特点,能为用户提供极大的便利,数据库管理系统应充分利用SQL语言提高计算机应用系统的工作质量与效率。SQL语言不仅能独立应用于终端,还可以作为子语言为其他程序设计提供有效助力,该程序应用中,SQL可与其他程序语言一起优化程序功能,进而为用户提供更多更全面的信息。 SQL Server数据库包括Microsoft SQL Server以及Sybase SQL Server两个子数据库,该数据库能否正常运行直接关系着整个计算机系统的运行安全。 人工智能与专家系统 人工智能(Artificial Intelligence) ,英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别

优先队列的基本数据结构(2)

爱⌒轻易说出口 提交于 2019-12-07 16:15:00
摘要:本次提供另外一些优先队列的基本操作 【1】 对二叉堆进行下滤,就是让某个元素降至到使得它符合二叉堆优先结构的节点. void PerLocateDown(Heap H, int i) //对二叉堆进行下滤 { int child; int FirstElement = H->Element[i]; for (;i* 2 <= H->heapsize; i = child ) { //for循环 一直到满足堆序或者到底层 //获取最小儿子 child = i* 2 ; if (child != H->heapsize && H->Element[child+ 1 ]<H->Element[child] ) child++; if (FirstElement > H->Element[child]) { //不满足堆序,交换节点 H->Element[i] = H->Element[child]; } else break ; //满足堆序 } H->Element[i] = FirstElement; } 【2】对二叉堆进行上滤,使得它上升到某个符合堆序的位置; void PerLocateUp(Heap H, int i ) { //将一个元素【i】上滤 int LastElement = H->Element[i]; for (; LastElement < H-

基于PriorityQueue(优先队列)解决TOP-K问题

假如想象 提交于 2019-12-06 23:34:41
TOP-K问题是面试高频题目,即在海量数据中找出最大(或最小的前k个数据),隐含条件就是内存不够容纳所有数据,所以把数据一次性读入内存,排序,再取前k条结果是不现实的。 下面我们用简单的Java8代码去解决TOP-K问题。为了使主要的逻辑更加清晰,去掉了一些如参数合法性检查等非关键代码。 PriorityQueue(优先队列)是JDK1.5开始提供的,主要作者包括大名鼎鼎的纽约大学教授Doug Lea,他也是Java JUC包的鼻祖哦。 PriorityQueue相当于一个堆(默认为小根堆,如果想要创建大根堆,那么在创建PriorityQueue时应指定为逆序,代码如下) new PriorityQueue<>(maxSize, Comparator.reverseOrder()); 下面我们就以默认的小根堆去解决TOP-K问题(小根堆用于解决前k个最大值,而大根堆用于解决前k个最小值) class FixSizedPriorityQueue {//自定义固定长度(k)的优先队列,因此可以解决Top-k问题 PriorityQueue<Integer> queue; int k; public FixSizedPriorityQueue(int k) { this.k = k; this.queue = new PriorityQueue<>(k); } public void