【问题标题】:Min Heap using STL Priority Queue explanationMin Heap using STL Priority Queue解释
【发布时间】:2016-04-04 01:49:42
【问题描述】:

我对 C++ 相当陌生,我试图在 C++ 中使用优先级队列 STL 来实现最小堆。我环顾网络,偶然发现了一个代码,即我在底部添加的链接。

我了解向量是如何工作的,我也了解函子是什么,但我不明白 'return i>j' 如何在从最小到最大排列元素中发挥作用。

我会把代码贴在这里。

#include <queue>
#include <iostream>

using namespace std;

struct comparator {
     bool operator()(int i, int j) {
     return i > j;
    }
};

int main(int argc, char const *argv[])
{
     priority_queue<int, std::vector<int>, comparator> minHeap;

    minHeap.push(10);
    minHeap.push(5);
    minHeap.push(12);
    minHeap.push(3);
    minHeap.push(3);
    minHeap.push(4);

    while (!minHeap.empty()) {
    cout << minHeap.top() << " ";
    minHeap.pop();
    }
    return 0;
}

有人可以跟踪程序的执行吗?在过去的几个小时里,我一直试图了解这个程序是如何工作的,但没有成功。

我从here得到代码

【问题讨论】:

  • 你有可以用来跟踪执行的调试器吗?
  • 如果你想跟踪程序的执行,每个编译器都有一个相关的调试器,你自己可以使用一个工具来单步调试代码,看看它是如何工作的,一步一步步。如果您花一些时间学习如何使用调试器来单步调试您已编译的代码,您将对自己大有帮助。遗憾的是,stackoverflow.com 的许多发帖者都非常缺乏这项技能。
  • 我是编程新手,还没有学会如何使用调试器。不过我很快就会学会的。

标签: c++ data-structures stl


【解决方案1】:

根据给定的标准,优先队列的第一个元素总是它包含的最大元素。这个标准是你的函子comparator。在这种情况下,它定义了对于两个给定元素,次要元素应该是第一个。

因此,在您的代码中,如果我们提取所有元素,则输出将是从 min 到 max 排序的元素:

while (!minHeap.empty()) {
   cout << minHeap.top() << " ";
   minHeap.pop();
}
//output: 3,3,4,5,10,12

推送元素的算法就像一个堆:

  1. 将新元素放在数组中的下一个可用位置。 (树的下层)
  2. 使用提供的函子 (comparator) 将新元素与其父元素进行比较。在这种情况下,您的比较是“如果 新元素更小”,然后将其与父元素交换。
  3. 继续此过程,直到:
    • 新元素的父元素小于或 等于新元素,或
    • 新元素到达根(索引 0 数组)

也许通过一个可视化的例子可以更清楚地看到算法是如何工作的:假设你已经推送了数字 6、3、5、9,现在你推送了 2。

【讨论】:

  • 当我按下 10 时,你能告诉我 i 和 j 的值是多少吗?
  • 另外你能告诉我当前元素的父元素是在代码的哪一部分找到/提取出来进行比较的吗?
  • 因为它是第一个元素,所以不会进行比较。您可以通过在函数内添加以下行来检查仿函数的跟踪:std::cout &lt;&lt; i &lt;&lt; " " &lt;&lt; j &lt;&lt; std::endl
  • 感谢您的回答。你能不能也回答一下另一个问题?
  • 当函数 push 被执行时,与父节点的比较(步骤 2)以类似递归的方式执行(步骤 3)。要找到给定节点的父节点,有多种可能性,具体取决于结构的表示方式,最常见的是:如果用数组表示,则具有返回父节点 idx 的数学函数;或如果表示为具有指向它的指针的树。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
相关资源
最近更新 更多