【算法学习】老算法,新姿势,STL——Heap
“堆”是一个大家很熟悉的数据结构,它可以在\(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的更多相关文章
- 【STL源码学习】STL算法学习之一
第一章:引子 STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>, ...
- STL——heap结构及算法
heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个幕后英雄,扮演priority q ...
- STL -- heap结构及算法
STL -- heap结构及算法 heap(隐式表述,implicit representation) 1. heap概述 : vector + heap算法 heap并不归属于STL容器组件,它是个 ...
- STL学习笔记--算法
关于STL算法需要注意的是: (1) 所有STL算法被设计用来处理一个或多个迭代器区间.第一个区间通常以起点和终点表示,至于其他区间,多数情况下只需提供起点即可,其终点可自动以第一区间的元素数推导出来 ...
- <2014 05 09> Lucida:我的算法学习之路
[转载] 我的算法学习之路 关于 严格来说,本文题目应该是我的数据结构和算法学习之路,但这个写法实在太绕口——况且CS中的算法往往暗指数据结构和算法(例如算法导论指的实际上是数据结构和算法导论),所以 ...
- python常用算法学习(3)
1,什么是算法的时间和空间复杂度 算法(Algorithm)是指用来操作数据,解决程序问题的一组方法,对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但是在过程中消耗的资源和时间却会有很大 ...
- 【2018.07.28】(字符串/回文串)学习Manacher算法小记
主要是应用在回文串啦,原理也理解了老半天,如果没有图片的话,我也看不太懂它的原理 学习的灵感来源来自于:https://segmentfault.com/a/1190000008484167 /* 最 ...
- Unity实现A*寻路算法学习2.0
二叉树存储路径节点 1.0中虽然实现了寻路的算法,但是使用List<>来保存节点性能并不够强 寻路算法学习1.0在这里:https://www.cnblogs.com/AlphaIcaru ...
- 算法学习:并行化初体验_JAVA实现并行化归并算法
这个系列包括算法导论学习过程的记录. 最初学习归并算法,对不会使其具体跑在不同的核上报有深深地怨念,刚好算倒重温了这个算法,闲来无事,利用java的thread来体验一下并行归并算法.理论上开的thr ...
随机推荐
- SPOJ_SUBLEX
经典题目:给一个字符串,求字典序第k小的子串是什么. 涉及子串问题,上自动机. 首先我们可以用记忆化搜索的方法,求出到达某一个状态后,能产生多少个新状态. 首先,到达这个状态就不走了,这肯定是一种状态 ...
- python操作mysql实例
#coding=utf-8 import MySQLdb # 打开数据库连接 db = MySQLdb.connect(host='localhost',user='root',passwd='',d ...
- 【题解】HAOI2018染色
好坑啊不开心…… 其实这题的想法还是比较简单粗暴的.题目明示恰好xxx,显然排除斜率二分这个玩意儿,那么不就只剩下容斥了嘛…… 令 \(A_{x}\) 为恰好出现了 \(S\) 次的至少有 \(x\) ...
- Merge Two Sorted Lists - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Merge Two Sorted Lists - LeetCode 注意点 两个链表长度可能不一致 解法 解法一:先比较两个链表长度一致的部分,多余的部分 ...
- Android 5.0 Lollipop SDK下载地址(PASS)
Android 5.0 ARM EABI v7a System Image https://dl-ssl.google.com/android/repository/sys-img/google_ap ...
- Andoid自动判断输入是电话,网址或者Email的方法--Linkify
Andoid自动判断输入是电话,网址或者Email的方法----Linkify的应用!http://blog.csdn.net/android_tutor/article/details/500016 ...
- 在Kubernetes集群里安装微服务DevOps平台fabric8
转载于https://blog.csdn.net/wzp1986/article/details/72128063?utm_source=itdadao&utm_medium=referral ...
- K8S调度之标签选择器
Kubernetes 调度简介 除了让 kubernetes 集群调度器自动为 pod 资源选择某个节点(默认调度考虑的是资源足够,并且 load 尽量平均),有些情况我们希望能更多地控制 pod 应 ...
- DBMS_RANDOM 用法
oracle中用于生成随机数的包:DBMS_RANDOM,这个包里面包含了很多方法,以下列出几个常用的方法 1.DBMS_RANDOM.RANDOM方法: FUNCTION random RETURN ...
- python常用模块(3)
ConfigParser模块学习 ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可 ...