“堆”是一个大家很熟悉的数据结构,它可以在\(O(log\;n)\)的时间内维护集合的极值。

这都是老套路了,具体的内部实现我也就不谈了。

我一般来说,都是用queue库中的priority_queue,也就是STL的优先队列来实现堆的,然而最近我发现了一个新的STL容器,它相对优先队列有着更小的常数和更方便的操作。

它就是heap,就是堆。

关于heap,STL提供了4个函数,它们都定义于algorithm库中。它们分别是:

建立堆:

make_heap(_First, _Last, _Cmp)

在堆中添加元素:

push_heap(_First, _Last, _Cmp)

要先添加元素,再调用函数。

在堆中删除元素:

pop_heap(_First, _Last, _Cmp)

要先调用函数,再删除(不删也可以,只要保证不会出现内存泄漏或者其它bug)。

堆排序:

sort_heap(_First, _Last, _Cmp)

排完序,就像普通的sort一样了,变成有序数组了。不再具有堆的性质。

sort一样,其中_First_Last都是头,尾指针或迭代器(对应vector或queue),而_Cmp表示了元素间的大小关系函数。

类似sort,堆中的元素是[_First, _Last)的区间,若内存不连续,也至少要是可随机访问的迭代器(如vector)。

其中_Cmp不是必要的,但是如果有定义_Cmp,一般情况下所有函数都需要加上_Cmp。

还需注意这些函数维护的均是大根堆(即父亲值比孩子大的堆,也称最大堆)。

【算法学习】老算法,新姿势,STL——Heap的更多相关文章

  1. 【STL源码学习】STL算法学习之一

    第一章:引子 STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>, ...

  2. STL——heap结构及算法

    heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority q ...

  3. STL -- heap结构及算法

    STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...

  4. STL学习笔记--算法

    关于STL算法需要注意的是: (1) 所有STL算法被设计用来处理一个或多个迭代器区间.第一个区间通常以起点和终点表示,至于其他区间,多数情况下只需提供起点即可,其终点可自动以第一区间的元素数推导出来 ...

  5. <2014 05 09> Lucida:我的算法学习之路

    [转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...

  6. python常用算法学习(3)

    1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...

  7. 【2018.07.28】(字符串/回文串)学习Manacher算法小记

    主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...

  8. Unity实现A*寻路算法学习2.0

    二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...

  9. 算法学习:并行化初体验_JAVA实现并行化归并算法

    这个系列包括算法导论学习过程的记录. 最初学习归并算法,对不会使其具体跑在不同的核上报有深深地怨念,刚好算倒重温了这个算法,闲来无事,利用java的thread来体验一下并行归并算法.理论上开的thr ...

随机推荐

  1. variant conversion error for variable v23

    excel数据导入到oracle数据库出现的问题 V23指的是excel列.,这列的数据长度超出或者类型与数据库表不一致导致的 解决方法,1.清空该列,再建个新列 2.用access  SQL查出长度 ...

  2. Swift使用SDWebImage处理远程图片资源

    第一步:配置SDWebImage 打开github,https://github.com/rs/SDWebImage,将SDWebImage下载到本地 用Xcode创建一个swift的singleVi ...

  3. 【XSY1841】Intervals

    Description 在一个长度为m的序列中选出n个区间,这些区间互不包含,且至少有一个区间的左端点为x. 问有多少种方案,注意交换两个区间的顺序视为不同方案. ​ 答案很大,输出模10000000 ...

  4. Hbase(七)hbase高级编程

    一.Hbase结合mapreduce 为什么需要用 mapreduce 去访问 hbase 的数据?     ——加快分析速度和扩展分析能力     Mapreduce 访问 hbase 数据作分析一 ...

  5. bzoj4784【zjoi2017】仙人掌

    题目描述 如果一个无自环无重边无向连通图的任意一条边最多属于一个简单环,我们就称之为仙人掌.所谓简单环即不经过 重复的结点的环. 现在九条可怜手上有一张无自环无重边的无向连通图,但是她觉得这张图中的边 ...

  6. [CQOI2016] 手机号码 (数位dp)

    link $solution:$ $10^{10} \leq L \leq R < 10^{11}$这个数据范围很容易想到数位$dp$. 依照题意模拟即可. #include<iostre ...

  7. VMware 安装Ubuntu16.04时显示不全的解决方法

    实际安装时发现进行到分区这个步骤时,看不到下面的按钮, 百度后得知有此遭遇的不在少数,是因为系统默认分辨率与电脑分辨率的差异导致的. 解决方法也很简单粗暴: 左手按住alt键右手鼠标往上拖动安装界面, ...

  8. U33405 纽约

    U33405 纽约 花费 \(w\) 元可以购买一辆容量为 \(w\) 的车 现在你有 \(n <= 2000\) 个物品, 搬运策略: 一直搬能放下里面最重的, 直到任意物品都不能搬上为止 求 ...

  9. 2017 清北济南考前刷题Day 2 morning

    期望得分:100+30+60=190 实际得分:100+30+30=160 T1 最优方案跳的高度一定是单调的 所以先按高度排序 dp[i][j] 跳了i次跳到j 枚举从哪儿跳到j转移即可 #incl ...

  10. Eclipse使用小结

    一.Eclipse新建工作空间设置默认编码格式UTF-8 1.windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->W ...