优先队列与贪心(解释)
需积分: 0 82 浏览量
更新于2024-03-10
收藏 934KB PDF 举报
### 优先队列与贪心算法详解
#### 一、优先队列概述
**优先队列**是一种特殊的数据结构,其主要特点是队列中的每个元素都有一个优先级,且每次弹出的操作总是移除并返回优先级最高的那个元素。在C++中,优先队列通常实现为**大根堆**或**小根堆**。
- **大根堆**:队列中最大值始终位于队列顶部。
- **小根堆**:队列中最小值始终位于队列顶部。
优先队列的基本操作包括:
- `empty()`:判断队列是否为空。
- `pop()`:移除队列顶部的元素。
- `push()`:向队列中添加一个新元素。
- `size()`:返回队列中元素的数量。
- `top()`:返回队列顶部的元素,但不移除它。
#### 二、优先队列的基本应用与实现
##### 基本定义与操作
```cpp
#include <queue>
std::priority_queue<int> pq;
pq.push(5); // 添加元素
pq.pop(); // 移除顶部元素
pq.top(); // 访问顶部元素
pq.empty(); // 判断队列是否为空
pq.size(); // 获取队列大小
```
##### 自定义优先队列
当需要存储自定义数据类型时,可以通过重写比较运算符 `<` 来实现自定义的优先队列。
**1. 在类内声明成员函数**
```cpp
struct Node {
int a, b;
bool operator<(const Node& x) const {
return a > x.a; // 大于则表示优先级更高
}
};
int main() {
std::priority_queue<Node> pq;
pq.push({1, 2});
pq.push({2, 3});
std::cout << pq.top().a << " " << pq.top().b << std::endl; // 输出: 2 3
}
```
**2. 在类内声明为友元函数**
```cpp
struct Node {
int a, b;
friend bool operator<(const Node& x, const Node& y) {
return x.a > y.a; // 小于表示优先级更高
}
};
int main() {
std::priority_queue<Node> pq;
pq.push({1, 2});
pq.push({2, 3});
std::cout << pq.top().a << " " << pq.top().b << std::endl; // 输出: 1 2
}
```
**3. 在类外重载小于号**
```cpp
struct Node {
int a, b;
};
bool operator<(const Node& x, const Node& y) {
return x.a > y.a; // 小于表示优先级更高
}
int main() {
std::priority_queue<Node> pq;
pq.push({1, 2});
pq.push({2, 3});
std::cout << pq.top().a << " " << pq.top().b << std::endl; // 输出: 1 2
}
```
#### 三、优先队列的扩展
##### pair与make_pair
**Pair** 是C++ STL中的一个容器,用于存储两个元素的有序对。它可以方便地用于存储具有固定顺序的两组数据。
**Make_pair** 是一个函数模板,用于创建pair对象。
**相同点**:
- 都是用来组合两个数据的。
- 可以组合同类型或不同类型的数据。
**不同点**:
- **Pair** 是一种数据类型,而 **Make_pair** 是一个函数。
- 使用 **Pair** 需要显式指定类型,而 **Make_pair** 可以通过模板推导类型。
**示例代码**:
```cpp
#include <iostream>
#include <utility> // 包含pair和make_pair
int main() {
std::pair<int, double> p1 = std::make_pair(1, 3.14);
std::pair<int, double> p2(1, 3.14); // 直接使用pair构造
std::cout << "p1: " << p1.first << ", " << p1.second << std::endl;
std::cout << "p2: " << p2.first << ", " << p2.second << std::endl;
return 0;
}
```
### 四、贪心算法简介
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择策略,从而希望导致结果是最好或最优的算法。贪心算法的关键在于正确地识别问题的性质以及如何确定“当前状态下的最好选择”。
在实际应用中,贪心算法常与优先队列结合使用,如在解决任务调度、资源分配等问题时,常常会用到优先队列来辅助贪心算法进行决策。
### 总结
优先队列是一种非常有用的数据结构,在很多场景下都能发挥重要作用。通过本文的学习,我们不仅了解了优先队列的基本概念及其在C++中的实现方法,还学习了如何自定义比较器来满足特定的需求。同时,我们也简单介绍了贪心算法,并探讨了它与优先队列之间的联系。这些知识将在未来的算法设计与开发过程中起到关键作用。