定义

拥有权值观点的queue,,一个是返回最高优先级对象,一个是在底端添加新的对象。这种数据结构就是优先级队列(Priority Queue) 。

实现

利用max_heap完成,以vector表现的完全二叉堆。max_heap可以满足priority_heap所需要的依照权值高低自动递减的特性。

二叉堆

二叉堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 有了这一性质,那么二叉堆上最大值就是根节点了。

二叉堆的表现形式:我们可以使用数组的索引来表示元素在二叉堆中的位置。

从二叉堆中,我们可以得出:

· 元素k的父节点所在的位置为[k/2]

· 元素k的子节点所在的位置为2k和2k+1

跟据以上规则,我们可以使用二维数组的索引来表示二叉堆。通过二叉堆,我们可以实现插入和删除最大值都达到O(nlogn)的时间复杂度。

对于堆来说,最大元素已经位于根节点,那么删除操作就是移除并返回根节点元素,这时候二叉堆就需要重新排列;当插入新的元素的时候,也需要重新排列二叉堆以满足二叉堆的定义。现在就来看这两种操作。

从下至上的重新建堆操作: 如果一个节点的值大于其父节点的值,那么该节点就需要上移,一直到满足该节点大于其两个子节点,而小于其根节点为止,从而达到使整个堆实现二叉堆的要求。

由上图可以看到,我们只需要将该元素k和其父元素k/2进行比较,如果比父元素大,则交换,然后迭代,一直到比父元素小为止。

private static void Swim(int k)
{
//如果元素比其父元素大,则交换
while (k > 1 && pq[k].CompareTo(pq[k / 2]) > 0)
{
Swap(pq, k, k / 2);
k = k / 2;
}
}

这样,往堆中插入新元素的操作变成了,将该元素从下往上重新建堆操作:

代码实现如下:

public static void Insert(T s)
{
//将元素添加到数组末尾
pq[++N] = s;
//然后让该元素从下至上重建堆
Swim(N);
}

动画如下:

由上至下的重新建堆操作:当某一节点比其子节点要小的时候,就违反了二叉堆的定义,需要和其子节点进行交换以重新建堆,直到该节点都大于其子节点为止:

代码实现如下:

private static void Sink(int k)
{
while (2 * k < N)
{
int j = 2 * k;
//去左右子节点中,稍大的那个元素做比较
if (pq[j].CompareTo(pq[j + 1]) < 0) j++;
//如果父节点比这个较大的元素还大,表示满足要求,退出
if (pq[k].CompareTo(pq[j]) > 0) break;
//否则,与子节点进行交换
Swap(pq, k, j);
k = j;
}
}

这样,移除并返回最大元素操作DelMax可以变为:

1. 移除二叉堆根节点元素,并返回

2. 将数组中最后一个元素放到根节点位置

3. 然后对新的根节点元素进行Sink操作,直到满足二叉堆要求。

移除最大值并返回的操作如下图所示:

以上操作的实现如下:

public static T DelMax()
{
//根元素从1开始,0不存放值
T max = pq[1];
//将最后一个元素和根节点元素进行交换
Swap(pq, 1, N--);
//对根节点从上至下重新建堆
Sink(1);
//将最后一个元素置为空
pq[N + 1] = default(T);
return max;
}

动画如下:

优先级队列Priority_queue的更多相关文章

  1. STL学习系列七:优先级队列priority_queue容器

    1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 这里给个例子: #include< ...

  2. C++ STL 学习笔记__(6)优先级队列priority_queue基本操作

    10.2.7优先级队列priority_queue v  最大值优先级队列.最小值优先级队列 v  优先级队列适配器 STL priority_queue v  用来开发一些特殊的应用,请对stl的类 ...

  3. C++ - 库函数优先级队列(priority_queue)输出最小值 代码

    库函数优先级队列(priority_queue)输出最小值 代码 本文地址: http://blog.csdn.net/caroline_wendy 库函数优先级队列(priority_queue)的 ...

  4. c++ 优先级队列(priority_queue)

    从网上搜优先级队列用法,都是有些乱七八糟的,有几种用法都没说,直接贴代码.实在郁闷,于是自己在此归纳归纳. 废话不多说,直入主题. 优先级队列的核心是比较函数的实现. 比较函数有两种实现方法: 1.在 ...

  5. STL之优先级队列priority_queue

    摘要: priority_queue,自适应容器(即容器适配器):不能由list来组建: 最大值优先级队列(最大值始终在对首,push进去时候) 最小值优先级队列: 优先级队列适配器 STL  pri ...

  6. STL中的优先级队列priority_queue

    priority_queue(queue类似)完全以底部容器为根据,再加上二叉堆(大根堆或者小根堆)的实现原理,所以其实现非常简单,缺省情况下priority_queue以vector作为底部容器.另 ...

  7. STL中的优先级队列(priority_queue)的自己实现priqueue

    这篇文章主要介绍堆(最大堆和最小堆),以及一些系统对一些任务,比如线程,进程做调度的时候,所采用的优先级队列. 主要思想就是,做一个最大堆(任务的权重最大的在顶端),把顶端的任务取出,重新做一个堆,处 ...

  8. STL-优先级队列-priority_queue

    头文件是<queue> 操作很简单 #include <iostream> #include <cstdio> #include <queue> usi ...

  9. cb05a_c++_STL优先级队列priority_queue_less_greater

    /*cb05a_c++_STL优先级队列priority_queue自适应容器(容器适配器):不能使用list,list不能使用随机操作最大值优先级队列,//把数据放在队列里面是,最大的始终都是放在最 ...

随机推荐

  1. JSP基本语法总结【2】九大内置对象

    内置对象也称为内建对象,隐含对象,即无需声明,直接可以在JSP中使用的java对象.JSP的内置对象就是把最常用.重要的几个对象直接创建了. JSP有9大内置对象:Request,Response, ...

  2. Wireshark网络端点和会话

    如果想让网络进行正常通信,你必须至少拥有两台设备进行数据流交互.端点(endpoint)就是指网络上能够发送和接受数据的一台设备.举例来说,在TCP/IP的通信中就有两个断电:接收和发送数据系统的IP ...

  3. js 监控iframe URL的变化

    iframe的url可以前端任何地址,这样就可能出现漏洞,如果钓鱼网站通过js把src改成了危险地址,如果没有监控,就会有很大隐患.所以监控iframe的url变化就是必须要解决的问题了. 第一印象的 ...

  4. Java基础语法<三> 输入输出

    1. 读取输入 Scanner in = new Scanner(System.in);   输入一行(包含空格) String str = in.nextLine()   读取一个单词(以空白符作为 ...

  5. 获取子物体数量---Transform.childCount

    如何判断一个物体下是否有子物体?getchild(0)!=null?显然不可取 那去获取拿到子物体数量?transform.GetChildCount();可以解决 但在新版本中已被弃用,可用tran ...

  6. [基础架构]PeopleSoft都有哪些进程运行在进程服务器上

    PSPRCSRV:(PSPRCSRV.EXE) 该进程负责启动所有服务进程. 每隔15s,该进程就会去看进程调度器中是否有需要运行的进程请求.如果没有需要运行的则sleep15s,然后再次检查. 如果 ...

  7. 业余草教你解读Spark源码阅读之HistoryServer

    HistoryServer服务可以让用户通过Spark UI界面,查看历史应用(已经执行完的应用)的执行细节,比如job信息.stage信息.task信息等,该功能是基于spark eventlogs ...

  8. Android - Fragment (一)定义

    什么是Fragment,为什么要用Fragment? Fragment,直译为碎片.是Android UI的一种. Fragment加载灵活,替换方便.定制你的UI,在不同尺寸的屏幕上创建合适的UI, ...

  9. 【转载】CANoe 入门 Step by step系列(二)CAPL编程

    来源:http://www.cnblogs.com/dongdonghuihui/archive/2012/09/26/2704619.html CAPL就是Communication Applica ...

  10. 支付宝LR集群压测报告

    支付宝压力测试报告 时间:2016-03-23                                             测试人员:XXX 目录 支付宝压力测试报告 1 目录 1 一   ...