赞
踩
it人员无论是使用哪种高级语言开发东东,想要更高效有层次的开发程序的话都躲不开三件套:数据结构,算法和设计模式。数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。
此系列专注讲解数据结构数组、链表、队列、栈、树、哈希表、图,通过介绍概念以及提及一些可能适用的场景,并以C++代码简易实现,多方面认识数据结构,最后为避免重复造轮子会浅提对应的STL容器。本文介绍的是堆Heap。
(开发环境:VScode,C++17)
关键词
: C++,数据结构,堆,Heap
声明:
本文作者原创,转载请附上文章出处与本文链接。
堆比较特殊,通常被看作一棵完全二叉树的数组对象。被用于实现“优先队列”(priority queues),优先队列是一种数据结构,可以自由添加数据,但取出数据时要从最小值开始按顺 序取出。在堆的树形结构中,各个顶点被称为“结点”(node),数据就存储在这些结点中。
上面叫大顶堆,如果每一个节点小于子树中每个节点的值,那就叫小顶堆。
只要满足下面两个特点的树形结构就是堆:
#ifndef CHEAP_H
#define CHEAP_H
#include <iostream>
#include <algorithm>
#include <vector>
#include <cassert>
using namespace std;
template <typename T>
class MaxHeap
{
public:
void heapify(int i); // 辅助函数:调整堆
void push(const T& element); // 添加元素到堆中
T pop(); // 移除并返回堆顶元素
T top() const; // 返回堆顶元素
bool empty() const { return heap.empty(); } // 检查堆是否为空
size_t size() const { return heap.size(); } // 返回堆的大小
private:
vector<T> heap;
};
template <typename T>
inline void MaxHeap<T>::heapify(int i)
{
int left = 2 * i + 1;
int right = 2 * i + 2;
int largest = i;
if (left < heap.size() && heap[left] > heap[largest]) {
largest = left;
}
if (right < heap.size() && heap[right] > heap[largest]) {
largest = right;
}
if (largest != i) {
swap(heap[i], heap[largest]);
heapify(largest); // 递归调整子堆
}
}
template <typename T>
inline void MaxHeap<T>::push(const T &element)
{
heap.push_back(element);
// 从新添加的节点开始向上调整堆
int i = heap.size() - 1;
while (i > 0 && heap[(i - 1) / 2] < heap[i]) {
swap(heap[i], heap[(i - 1) / 2]);
i = (i - 1) / 2;
}
}
template <typename T>
inline T MaxHeap<T>::pop()
{
if(heap.empty())
return T();
T top = heap[0];
heap[0] = heap.back();
heap.pop_back();
// 从堆顶开始向下调整堆
heapify(0);
return top;
}
template <typename T>
inline T MaxHeap<T>::top() const
{
if(heap.empty())
return T();
return heap[0];
}
#endif // !CHEAP_H
#include "cheap.h"
using namespace std;
int main()
{
MaxHeap<int> maxHeap;
maxHeap.push(20);
maxHeap.push(18);
maxHeap.push(15);
maxHeap.push(8);
maxHeap.push(10);
maxHeap.push(5);
maxHeap.push(3);
cout << "Top element: " << maxHeap.top() << endl;
maxHeap.pop();
cout << "Top element after pop: " << maxHeap.top() << endl;
return 0;
};
priority_queue:
priority_queue 默认在 vector 上使用堆算法将 vector 中元素构造成大顶堆的结构,用户也可以通过自定义模板参数中的 class Compare 来实现一个小顶堆。因此 priority_queue 就是堆 ,所有需要用到堆的位置,都可以考虑使用 priority_queue。
C/C++专栏:https://blog.csdn.net/weixin_45068267/category_12268204.html
(内含其它数据结构及对应STL容器使用)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。