gpt4 book ai didi

c++ - 使用堆构建优先级队列

转载 作者:太空宇宙 更新时间:2023-11-04 14:01:50 25 4
gpt4 key购买 nike

如果堆基于数组并且根被提取,我使用的代码假设重新排列节点以便维护堆属性。

根据我的理解,数组和堆并不完全相同,但在代码中,构建堆似乎只是重新排列数组,使其拥有堆属性。这是创建堆的标准方法吗?是否有必要填充另一个数组而不是仅仅改变它所基于的数组?

我很难理解这个概念,因为当我使用函数 extract-max 删除根时,除非我从数组中弹出元素,否则数组的大小保持不变。并且堆应该更小,但所发生的只是向上移动以替换根的节点在数组中由零指示并且它没有被删除。

如果我确实保留堆基本上是服从堆属性的数组的结构,我该如何删除不应再属于堆的节点?在我的代码中,此节点在打印数组时由 0 表示。

#include <iostream>
#include <deque>
#include "print.h"
#include "random.h"

int parent(int i)
{
return (i - 1) / 2;
}

int left(int i)
{
if(i == 0)
return 1;
else
return 2*i;
}

int right(int i)
{
if(i == 0)
return 2;
else
return 2*i + 1;
}

void max_heapify(std::deque<int> &A, int i, int heapsize)
{
int largest;
int l = left(i);
int r = right(i);
if(l <= heapsize && A[l] > A[i])
largest = l;
else
largest = i;
if(r <= heapsize && A[r] > A[largest])
largest = r;
if(largest != i) {
exchange(A, i, largest);
max_heapify(A, largest, heapsize);
}
}

void build_max_heap(std::deque<int> &A)
{
int heapsize = A.size() - 1;
for(int i = (A.size() - 1) / 2; i >= 0; i--)
max_heapify(A, i, heapsize);
}

int heap_extract_max(std::deque<int> &A, int heapsize)
{
if(heapsize < 0)
throw std::out_of_range("heap underflow");
int max = A.front();
//A.pop_front();
A[0] = A[heapsize--];
//A.pop_back();
max_heapify(A, 0, heapsize);
return max;
}

int main(int argc, const char * argv[])
{
std::deque<int> B = deq(7);
print(B);
build_max_heap(B);
print(B);
std::cout << "Extract max ->\t" << heap_extract_max(B, B.size()) << std::endl;
print(B);
std::cout << "Extract max ->\t" << heap_extract_max(B, B.size()) << std::endl;
print(B);
return 0;
}

输出:

79 92 86 29 27 42 6 
92 86 79 29 27 42 6
Extract max -> 92
86 79 42 29 27 0 6
Extract max -> 86
79 42 27 29 0 0 6

最佳答案

您的 heap_extract_max 函数正在丢弃 std::deque 中的最后一个元素。

int heap_extract_max(std::deque<int> &A, int heapsize)
{
if(heapsize < 0)
throw std::out_of_range("heap underflow");
int max = A.front(); // Get a copy of the first element
A[0] = A[heapsize--]; // Copy the last element to the first element
// and reduce the heap size, effectively
// discarding the last element.
max_heapify(A, 0, heapsize);
return max;
}

在此之后,如果需要,您可以安全地在 std::deque 上使用 pop_back() 从容器中移除该元素。

关于c++ - 使用堆构建优先级队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com