我的作业遇到了一些麻烦。我被要求使用C ++中的堆来实现优先级队列。
在搜索用于创建堆的代码示例时,我在此定义中遇到过很多次:
表示堆的数组 A 是一个包含两个属性的数组:
- 长度,数组中元素的数量
- heap-size ,存储在数组中的堆元素数
所以我的问题是: A 是什么?我需要自己实现它(让我们说一个类堆,它包含3个字段 - 数组元素,长度和heap_size)?
我只是不知道如何开始。
答案 0 :(得分:2)
二进制堆数据结构通常绘制为具有某些属性的二叉树,但通常使用普通数组实现。原因是数组版本使用的内存少于显式二叉树,并且更容易操作。因此,您所看到的数组 A 是保存堆中所有值的数组。
您看到的两个字段代表该数组的原始总大小(长度),它跟踪可用的存储空间量,以及该数组中您实际使用的元素数量(的堆大小强>)。当您将一个元素插入堆中时,您需要确保它存在空间,可能需要将数组重新分配为更大并复制现有元素,然后需要运行一个冒泡操作来插入新元素进入堆。
但是,通常情况下,您可以通过将堆层叠在动态数组之上来回避维护数组和这两个字段的逻辑,例如C ++ std::vector
或Java ArrayList
。这样,跟踪存储空间和增长数组的逻辑就会自动为您处理。
根据分配参数,由于这是在C ++中完成的,您可能需要查看std::make_heap
中的std::push_heap
,std::pop_heap
和<algorithm>
算法头。它们使得在std::vector
之类的现有容器之上实现堆非常容易。实际上,这就是std::priority_queue
类通常的实现方式。
如果您需要自己实施堆操作,可能需要查看 the description of a binary heap given in this assignment handout ,这似乎与您给出的作业非常匹配。
希望这有帮助!