我想在c ++中实现一个insert函数来构建一个d-max堆。 d表示堆中的子节点数,而最大堆是一个具有其'的堆。优先构成的要素(3,2,1 ......)。堆应该表示为一个数组,而我正在寻找的函数是从顶部逐个添加项目然后继续向下。这似乎是一件容易的事,但我对这是如何工作感到困惑。
以下是模板功能的一个粗略示例:
template <typename Comparable>
void buildHeapTopDown(Comparable arr[], int size, int d)
{
for (int i = 0; i < 5; ++i)
{
arr[0] = 2;
arr[1] = 3;
arr[2] = 4;
arr[3] = 6;
arr[4] = 9;
}
}
现在因为这是一些非常基本的代码,所以函数并没有真正提供有关d-heap工作方式的信息。我的意思是我没有实现d-heap背后的理论,它基本上和二进制堆背后的理论基本相同(我们在公式中只用d代替2)。用于查找堆的父项和子项的公式将变为:
(x-1) / d
,x*d + 1
(左子)和x*d + 2
(右子)。
我也知道有一种方法可以使用<algorithm>
类创建堆,但由于这些函数已经准备好并且它们正在使用向量,所以它并不是我真正想要的对于。
使用算法类的示例:
#include <iostream>
#include <array>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int myInts[] = { 1, 2, 3, 5, 4, 7, 10, 13, 15, 6, 8, 17, 9, 11, 9 };
vector <int> v(myInts, myInts + 15);
make_heap(v.begin(), v.end());
cout << "Initial max heap: " << v.front() << endl;
pop_heap(v.begin(), v.end());
v.pop_back();
cout << "Max heap after pop: " << v.front() << endl;
v.push_back(77); // insert example
push_heap(v.begin(), v.end());
cout << "Max heap after push: " << v.front() << endl;
sort_heap(v.begin(), v.end());
cout << "Final sorted range:";
for (unsigned i = 0; i < v.size(); i++)
{
cout << " " << v[i];
}
cout << endl;
getchar();
getchar();
}
任何人都可以按照我在顶部描述的方式提供任何提示吗?