【问题标题】:Heapify a Vector in C++在 C++ 中堆集向量
【发布时间】: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。

【问题讨论】:

  • 您是否必须手动执行此操作才能完成作业?因为有&lt;algorithm&gt;std::make_heap()
  • std::make_heap() 是不允许的。
  • 这是 max-heapify 的简单副本,它假设数组索引是从 1 开始的。另外,特殊情况需要短路ifs
  • 对于新旧向量中的每个位置: -- 您的代码没有“新”和“旧”向量。它有一个向量,您正试图弄清楚如何用一个向量来做到这一点。如果你真的有一个“新”和“旧”向量,那么解决方案很简单——只需比较每个向量的位置,看看vector_old[i] 是否等于vector_new[i]。无论如何,我什至认为这是一个更好的解决方案,因为 heapify 函数应该只有一个目的,那就是 heapify。它不应该在统计行业。

标签: c++ vector


【解决方案1】:

使用std::make_heap

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    std::vector<int> v = {20, 19, 100, 2};
    std::make_heap(v.begin(), v.end());

    for(int i: v)
        std::cout << i << ", ";

    std::cout << std::endl;

    return 0;
}

打印:

100, 19, 20, 2,

【讨论】:

  • 因此,在您回答前 2 小时,OP 明确表示不允许使用 std::make_heap()
猜你喜欢
  • 1970-01-01
  • 2015-11-06
  • 1970-01-01
  • 2015-07-20
  • 1970-01-01
  • 2013-10-29
  • 2020-03-30
  • 2015-01-05
  • 2023-01-08
相关资源
最近更新 更多