优先队列(堆)笔记 c++
2016-05-06 21:24
603 查看
当队列中某个对象优先级比其他对象更高时候,需要比其他对象先出队列而不管所在的位置时候,需要使用优先队列。
有如下的实现方法
- 插入在对尾,出队时候遍历整个队列
- 插入时即进行排序,出队时候固定在队首或者对尾
- 使用二叉查找树
- 使用二叉堆
还有D堆,是对二叉堆的扩充,不赘述了
堆是完全二叉树,使用数组就可以很好的实现。(vector更好,不需要再扩容)
有如下的实现方法
- 插入在对尾,出队时候遍历整个队列
- 插入时即进行排序,出队时候固定在队首或者对尾
- 使用二叉查找树
- 使用二叉堆
还有D堆,是对二叉堆的扩充,不赘述了
堆是完全二叉树,使用数组就可以很好的实现。(vector更好,不需要再扩容)
template <typename T> class BinaryHeap { public: explicit BinaryHeap(int capacity = 100); explicit BinaryHeap(const vector<T> &items); bool isEmpty() const; //假设最小的出列,也可以调整最大的出列 const T & findMin() const; void insert( const T & t); void deleteMin(); void deleteMin ( T & t); void makeEmpty(); private: int currentSize; vector<T> array; void buildHeap(); void percolateDown(int hole); }; /*新元素首先找到最后位置,保证是完全二叉树,当它小于它的父节点时候,交换位置,当大于 父节点时,插入新元素*/ template <typename T> void BinaryHeap<T>::insert(const T &t) { int hole = ++currentSize; for( ; hole > 1 && t < array[ hole / 2]; hole /= 2) array[ hole ] = array[hole / 2]; array[hole] = t; } //删除堆中最小的元素,主要依靠percolateDown实现下滤 template <typename T> void BinaryHeap<T>::deleteMin() { if( isEmpty() ) throw underflowExcption(); array[1] = array[currentSize--]; percolateDown(1); } //删除堆中最小的元素并获得元素,主要依靠percolateDown实现下滤 template <typename T> void BinaryHeap<T>::deleteMin(T & t) { if (isEmpty()) throw underflowExcption(); t = array[1]; array[1] = array[currentSize--]; percolateDown(1); } //下滤函数 template <typename T> void BinaryHeap<T>::percolateDown(int hole) { int child; T t = array[hole]; for( ; hole * 2 < currentSize; hole = child) { child = hole * 2; if (child != currentSize && array[child + 1] < array[child]) ++child; if (array[child] < tmp) array[hole] = array[child]; else break; } array[hole] = tmp; }
相关文章推荐
- 深入分析C++引用
- static在C和C++里各代表什么含义
- c++ primer 学习笔记(1): 第1-5章
- 计算日期c语言(结构体+函数+闰年判断)
- c++ primer 学习笔记(2): 函数 function
- c++作业5
- C++实验5-字符串
- 新的Visual C++代码优化器
- Try out the latest C++ compiler toolset without waiting for the next update of Visual Studio
- C++ 学习之路(13):函数模板与类模板
- C++基础知识——二维数组做函数参数
- c++继承和多态
- C++第五次上机实验其他作业
- C语言中关于时间的函数
- C++中内置变量初始化及private继承相关
- More Effective C++----(23)考虑变更程序库
- C++第一次作业
- C++实验5——数组分离
- nyoj18 The Triangle
- 如何编译&使用boost库?