【问题标题】:How does Priority queue compare and maintIn heap property during the pop operation优先队列在pop操作时如何比较和维护堆属性
【发布时间】:2016-05-07 15:14:42
【问题描述】:

我正在处理优先级队列,我想检查在弹出操作期间如何维护堆属性。这是我的代码。

#include <iostream>
#include <queue>

using namespace std;

class g {
    public:
        bool operator() (int a, int b) {
        cout<<a<<" "<<b<<endl;
            return (a > b);
        }
};

int main() {
    priority_queue<int,vector<int>,g> p;
    p.push(2);
    cout<<"CHECK1"<<endl;
    p.push(4);
    cout<<"CHECK2"<<endl;
    p.push(8);
    cout<<"CHECK3"<<endl;
    p.push(1);
    cout<<"CHECK4"<<endl;
    while(!p.empty()) {
        cout<<p.top()<<endl;
        p.pop();
    }
}

输出是

CHECK1
2 4
CHECK2
2 8
CHECK3
4 1
2 1
CHECK4
1
8 2
2 4
2
4 8
4
8

这是构建的二进制堆:
1
2 8
4

我看到当 1 被弹出时,它被替换为 4,然后 2 被替换为 4 以维护堆属性和二进制堆
2
4 8
然后在弹出 2 时将 8 替换为 2,然后将 4 替换为 8 以保持堆属性,然后在弹出 4 时将 4 替换为 8,最后弹出 8。因此,根据我的输出是

CHECK1
2 4
CHECK2
2 8
CHECK3
4 1
2 1
CHECK4
1
4 2
2 8
2
8 4
4
8

我哪里错了?

【问题讨论】:

  • 我不清楚你的问题是什么。您是否尝试实现最小堆?
  • 是的,我为 minheap 编写了代码并得到了我首先编写的输出。但我不明白那个输出是怎么来的,并期望我最后给出的输出。而且我还解释了为什么我期望第二个输出。

标签: c++ stl heap priority-queue


【解决方案1】:

第一次致电

p.push(2)

节点 2 被添加到您的堆中,导致

 2
/ \

然后我们添加 4,它被添加到最左边的打开位置,导致

  2
 / \
4

从 2

  2
 / \
4   8

堆属性依然保持,最后我们加1。

    2
   / \
  4   8
 /
1

由于1

    2
   / \
  1   8
 /
4

由于 1

    1
   / \
  2   8
 /
4

现在回答你的问题。在我们第一次调用 top 时,我们返回堆的最小值,在我们的例子中是 1。然后我们弹出 1,将堆大小减少 1,并将堆中的最后一个值复制到根,结果是:

  4
 / \
2   8

因为2

  2
 / \
4   8

我们以这种方式继续,直到堆为空。我把它留给你弄清楚其余的。希望这会有所帮助。

【讨论】:

  • 从我离开的地方开始,2 被弹出,然后 8 成为新的根,4
  • 先生,从这里开始只有我的圆点。检查 4 之后在 top 和 pop 操作期间,最后一个 while 循环的输出是我在第一个输出表中显示的,但我期望输出显示在第二个输出表中,所以我错在哪里。
  • 先生,请检查第 4 行(第 2,3,5 行)后输出的差异。请解释该部分。
  • 我不知道我是否可以进一步解释这一点。 8 和 2 进行比较,2 成为新根,2 与 4 比较以确保满足堆属性,所以 2 仍然是根,然后弹出 2,8 成为新根,然后比较 4 和 8,4
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
  • 2020-09-07
  • 1970-01-01
  • 2021-06-17
  • 2021-09-19
相关资源
最近更新 更多