最大堆最小堆的建立
2017-05-22 11:41
316 查看
堆是一种数据结构,它是一颗完全二叉树,最大堆和最小堆是二叉堆的两种形式。
最大堆:每个父亲结点的键值都大于孩子结点
最小堆:每个父亲结点的键值都小于孩子结点
下面看一下我的实现方式↓
其中 向上调整与向下调整是建立一个最大最小堆的关键;调整时的比较大小是利用一个仿函数进行选择默认为大堆;
堆的作用挺大,比如优先级队列,top K问题 ,或者选择排序都用到堆的结构。
最大堆:每个父亲结点的键值都大于孩子结点
最小堆:每个父亲结点的键值都小于孩子结点
下面看一下我的实现方式↓
#pragma once #include using namespace std; template struct Great { bool operator()(const T& left ,const T& right)const { return left > right; } }; template struct Less { bool operator()(const T& left, const T& right)const { return left < right; } }; template> class Heap { public: Heap() {} Heap(T* a, size_t n) //用一个数组构建堆的构造函数 { _arr.reserve(n); for (int i = 0; i < n; i++) { _arr.push_back(a[i]); } //调整堆 for (int i = (_arr.size() - 2) / 2; i >= 0; --i) { AdjustDown(i); } } void AdjustDown(int root) //向下调整算法 { Comp com; int parent = root; int child = parent * 2 + 1; while (child < _arr.size()) { if (child + 1 < _arr.size() && com(_arr[child + 1] , _arr[child])) { child++; } if (com(_arr[child],_arr[parent])) { swap(_arr[child], _arr[parent]); parent = child; child = parent * 2 + 1; } else break; //循环到孩子小于父亲便可停止 } } void AdjustUp(int child) //向上调整算法 { Comp com; int parent = (child - 1) / 2; while (parent >= 0) { if (com(_arr[child], _arr[parent])) { swap(_arr[parent], _arr[child]); child = parent; parent = (child - 1) / 2; } else break; } } void Push(const T& x) //从堆尾插入一个数据 (数组尾) { _arr.push_back(x); AdjustUp(_arr.size() - 1); } void Pop() //删除堆顶数据 (数组头) { swap(_arr[0], _arr[_arr.size() - 1]); _arr.pop_back(); AdjustDown(0); } size_t Size() //返回大小 { return _arr.size(); } bool Empty() //是否为空 { return _arr.empty(); } T& Top() //返回 堆顶数据 { assert(_arr.size() > 0); return _arr[0]; } protected: vector _arr; //一个vector 堆的底层是一个数组; };
其中 向上调整与向下调整是建立一个最大最小堆的关键;调整时的比较大小是利用一个仿函数进行选择默认为大堆;
堆的作用挺大,比如优先级队列,top K问题 ,或者选择排序都用到堆的结构。
相关文章推荐
- 合并石子问题 贪心+最大最小堆基本操作
- Black Box--[优先队列 、最大堆最小堆的应用]
- C++实现堆、最大堆、最小堆 -- 堆排序插入删除操作
- 求中位数问题:最小堆,最大堆
- 最大最小堆的操作以及实现
- 试写二叉最小堆和最大堆
- 算法入门--堆排序2(建立最小堆,从大到小)
- 最大堆与最小堆的实现
- 一个IP能建立的最大连接数是多少?
- 用最大堆和最小堆实现中位数查找
- 2833 The Average 求数组的前k小、大数 最大堆,最小堆 STL
- 最小堆和最大堆的JAVA实现
- 最大最小堆介绍
- 最小堆的建立
- 最大堆/最小堆、siftup和siftdown
- 一个IP能建立的最大连接数是多少?
- Google 面试题:Java实现用最大堆和最小堆查找中位数 Find median with min heap and max heap in Java
- 最近在写的赫夫曼树、B树、二项堆等都会用到堆排序,所以把最大堆排序和最小堆排序一次性先给大家看看
- 详解Linux服务器最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少?
- 一亿数据获取前100个最大值(基于最小堆和Quicksort)