【发布时间】:2021-12-21 20:21:51
【问题描述】:
我正在尝试对通过引用传递给函数的给定向量进行堆化。该函数将向量的引用作为参数并将其堆积。我还试图计算与起点相比,向量中有多少位置发生了变化。我想在函数内部更新这个差异变量。
对于新旧向量中的每个位置:如果位置具有不同的值:diff++
这是我所拥有的:
void heapify(std::vector<int> &v, int &diff)
{
int max = diff;
int l = 2 * diff + 1;
int r = 2 * diff + 2;
if (l < (int)v.size() && v[l] > v[diff])
diff = l;
if (r < (int)v.size() && v[r] > v[diff])
diff = r;
if (max != diff) {
swap(v[max], v[diff]);
heapify(v, diff);
}
}
int main()
{
vector<int> v = {20, 19, 100, 2};
int diff = 0;
heapify(v, diff);
cout << "Different in " << diff << " positions. Heap: ";
for(int i: v)
cout << i << ", ";
cout << endl;
return 0;
}
真的很近。几个小故障:对于单项向量,内容不应该改变。对于从 1 到 10 的最小到最大的向量,差值相差 2。对于非常大的随机向量,差值相差 1。
【问题讨论】:
-
您是否必须手动执行此操作才能完成作业?因为有
<algorithm>的std::make_heap()。 -
std::make_heap() 是不允许的。 -
这是 max-heapify 的简单副本,它假设数组索引是从 1 开始的。另外,特殊情况需要短路
ifs -
对于新旧向量中的每个位置: -- 您的代码没有“新”和“旧”向量。它有一个向量,您正试图弄清楚如何用一个向量来做到这一点。如果你真的有一个“新”和“旧”向量,那么解决方案很简单——只需比较每个向量的位置,看看
vector_old[i]是否等于vector_new[i]。无论如何,我什至认为这是一个更好的解决方案,因为 heapify 函数应该只有一个目的,那就是 heapify。它不应该在统计行业。