优先队列与贪心(解释)

preview
需积分: 0 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++中的实现方法,还学习了如何自定义比较器来满足特定的需求。同时,我们也简单介绍了贪心算法,并探讨了它与优先队列之间的联系。这些知识将在未来的算法设计与开发过程中起到关键作用。