我需要创建一个minheap模板,其中包含节点。
我遇到的问题是我不知道是否需要创建节点模板类,还是应该作为结构包含在堆模板类中?
答案 0 :(得分:3)
最小堆通常不会(从不?)使用显式节点实现 - 因为堆始终是左填充(“完整”),因此具有明确定义的结构,由于节点的处理,这将是不必要的低效率和节点链接引入了相当多的开销,更不用说破坏引用的局部性,导致缓存未命中和性能不佳。
(当然,最大堆也是如此。)
相反,它们是使用数组实现的。事实上,C ++标准库已经包含函数make_heap
,push_heap
和pop_heap
来处理迭代器范围。将它们与vector
结合使用,就可以得到你的堆。
答案 1 :(得分:1)
基本上,节点不需要用节点作为模板类来实现。 实现可能类似于这个声明:
template <class T>
class MinHeap {
private:
std::vector<T> _heap;
int _maxSize;
int _size;
public:
MinHeap(int maxSize);
~MinHeap();
void Insert(T elem);
T RemoveMin();
private:
int LeftChild(int pos);
int RightChild(int pos);
int Parent(int pos);
boolean IsLeaf(int pos);
void Swap(int pos1, int pos2);
void PushDown(int position);
};