STL——Heap算法
来源:互联网 发布:狂雷flv视频下载软件 编辑:程序博客网 时间:2024/05/21 09:37
STL——heap算法
1、就排序而言,heap是一种特别的元素组织方式,应用于heap排序法(heapsort)。Heap可被视为一个以序列式集合实现而成的二叉树,具有两大性质:
(1)第一个元素总是最大。
(2)总是能够在对数时间内增加或移除一个元素。
2、STL中提供了4个算法:默认的排序准则是 operator<,也可以传入一个binary predicate 作为排序准则。
(1)make_heap():将某个区间内的元素转化为heap;
void make_heap(RandomAccessIterator beg, RandomAccessIterator end)void make_heap(RandomAccessIterator beg, RandomAccessIterator end, BinaryPredicate op)
- 两种形式都将[beg,end)区间内的元素转化为heap。
- op是个可有可无的(可选的)binary predicate,被视为排序准则,op(elem1,elem2)
- 只有在多于一个元素的情况下,才有必要使用这些函数处理heap,如果只有单一元素,那么它自动形成一个heap。
- 复杂度:线性,至多执行3*numElems次比较。
(2)push_heap():对heap增加一个元素;
void push_heap(RandomAccessIterator beg, RandomAccessIterator end)void push_heap(RandomAccessIterator beg, RandomAccessIterator end, BinaryPredicate op)
- 两种形式都将end之前的最后一个元素加入原本就是heap的[beg,end-1)区间内,是整个[beg,end)区间成为一个heap。
- op是个可有可无的(可选的)binary predicate,被视为排序准则,op(elem1,elem2)。
- 调用者必须保证,在进入函数时,[beg,end-1)区间内的元素原本便已形成一个heap,而新元素紧跟其后。
- 复杂度:对数,至多执行log(numElems)次比较。
(3)pop_heap():对heap取出下一个元素;
void pop_heap(RandomAccessIterator beg, RandomAccessIterator end)void pop_heap(RandomAccessIterator beg, RandomAccessIterator end, BinaryPredicate op)
- 以上两种形式都将heap[beg,end)内的最高元素(也就是第一个元素)移到最后位置,并将剩余区间[beg,end-1)内的元素组成一个新的heap。
- op是个可有可无的(可选的)binary predicate,被视为排序准则,op(elem1,elem2)。
- 调用者必须保证,在进入函数时,[beg,end)区间内的元素原本便已形成一个heap。
- 复杂度:对数,至多执行2*log(numElems)次比较。
(4)sort_heap():将heap转化为一个已排序群集(此后它就不再是heap了)。
void sort_heap(RandomAccessIterator beg, RandomAccessIterator end)void sort_heap(RandomAccessIterator beg, RandomAccessIterator end, BinaryPredicate op)
- 以上两种形式都可以将heap[beg,end)转换为一个已排序序列。
- op是个可有可无的(可选的)binary predicate,被视为排序准则,op(elem1,elem2)。
- 注意,此算法一旦结束,该区间就不再是个heap了。
- 调用者必须保证,在进入函数时,[beg,end)区间内的元素原本便已形成一个heap。
- 复杂度:nlogn,最多执行numElems*log(numElems)次比较。
Heap算法使用示例:
#include <iostream>#include <vector>#include <algorithm>using namespace std;int main(){ vector<int> vec{ 1,2,3,4,7,8,5,6,9,0 }; for (auto x : vec) cout << x << " "; cout << endl; make_heap(vec.begin(), vec.end()); //将某区间内的元素转化为heap cout << "after make_heap(): "; for (auto x : vec) cout << x << " "; cout << endl; vec.push_back(4); push_heap(vec.begin(), vec.end()); //对heap增加一个元素 cout << "after push_heap(): "; for (auto x:vec) cout << x << " "; cout << endl; pop_heap(vec.begin(), vec.end()); //对heap减少一个元素 cout << "after pop_heap() : "; for (auto x : vec) cout << x << " "; cout << endl; sort_heap(vec.begin(), vec.end()-1); //对[beg,end-1)区间内的元素进行排序,之后就不再是heap cout << "after sort_heap(): "; for (auto x : vec) cout << x << " "; cout << endl; return 0;}
参考:Nicolai M,Josuttis. 侯捷译. C++标准库(第2版)[M].北京:电子工业出版社,2015:604-607.
1 0
- STL——Heap算法
- C++ STL——heap相关算法
- STL算法 ---------- Heap算法
- 【STL】Heap算法——push_heap、pop_heap、sort_heap、make_heap
- STL中的heap算法
- STL算法之heap
- STL——heap堆
- STL——堆heap
- 【STL】顺序容器 — heap
- C++ STL 算法:Heap算法
- 手写堆heap(STL的heap算法)
- STL算法(Algorithms):堆(heap)
- STL系列——堆(heap)
- STL容器(五)——heap
- STL源码剖析——heap
- C++ STL学习——heap
- STL中heap算法(堆算法)
- SGI-STL学习笔记之heap算法
- iOS 截取当前屏幕
- Linux下的JDK和tomcat的安装教程
- React 基础实例教程
- 划分方法
- PTA 数据结构与算法题目集(中文)5-11 关键活动 (30分)
- STL——Heap算法
- 1029. Median (25)
- Linux下的MySQL数据库的安装
- Redis 配置篇
- 我的自动化测试历程(Selenium+TestNG+Java+ReportNG+Jenkins)
- 关于 scipy.misc module has no attribute imread 和循环登录
- 数组与字符串方法
- 【开发板教程目录分享】4412开发板实战教程纸制版
- Jquery中click事件重复执行的问题