【问题标题】:c++ map into min heapc ++映射到最小堆
【发布时间】:2016-12-08 08:26:12
【问题描述】:

我想知道一种获取(Map + min-Heap)数据结构的简单方法 在 C++ 中

我试过了:

struct Comp
{
    bool operator()(const pair<int,int>& y , const pair<int,int>& z)
    {
        return (y.second < z.second);
    }
};

priority_queue< pair<int,int> , map<int,int> , Comp > p;

现在我面临的问题是重新初始化,因为它在 priority_queue 中,我们不能像使用 maps 那样简单地初始化。
插入元素的唯一方法是

p.push(make_pair(value1,value2));

我也尝试使用简单的映射而不是使用 priority_queue,但问题再次是当我尝试使用 min_element 查找最小元素时,它返回值而不是这里也需要的键。

请提出解决问题的最快方法。 我也相信有一些超出我知识范围的方法。

【问题讨论】:

  • priority_queue的第二个参数“必须满足SequenceContainer的要求,它的迭代器必须满足RandomAccessIterator的要求。另外,它必须提供以下具有通常语义的函数:front() push_back () pop_back()" --en.cppreference.com/w/cpp/container/priority_queuestd::map 不符合这些要求。
  • 如果你在做 dijkstra 那么你确实需要一个最小堆(priority_queue)。这是地图无法做到的。让它使用默认的底层类型(向量)。
  • 您不需要索引。您想要从 top/pop 获得的最小值
  • 并注意虽然它不是优先级队列,但常规(有序)映射强制堆不变,并且可以使用std::begin(my_map)获得其最小值
  • 我不太明白你想要达到什么目的。对于 Dijkstra 来说,一个常规的优先级队列就足够了,你想如何优化它?

标签: c++ dictionary data-structures stl heap


【解决方案1】:

不,您不能索引优先级队列中的元素来更改值。您要么必须自己使用 changeKey() 操作(可以非常优化)来实现整个优先级队列,要么做一些其他的解决方法。

我已经为 Prim 的算法实现了一个优先级队列,它使用 decreaseKey() 操作来计算最小生成树。如果你想实现优先队列,那么你可以查看我的回答 here 或其他一些解决方法,查看 Gassa 的回答 here

【讨论】:

  • 非常感谢
【解决方案2】:

如果您查看第一条评论,并点击priority_queue 文档的链接,那么您拥有所需的所有工具。

假设您已经在某处定义了一条边。比方说

struct edge {
    int vertex1, vertex2;
    int weight;
    bool operator> (const edge &ref) const {return weight > ref.weight;}
};

您需要一个堆,根据文档,它应该基于向量或双端队列。我通常更喜欢vector,但我把deque放在这里只是为了好玩。如果你想要一个最小堆,文档说使用 std::greater,因此你还必须实现 edge::operator>

#include <queue>      // std::priority_queue and std::deque
#include <functional> // std::greater
typedef std::priority_queue<edge, std::deque<edge>, std::greater<edge> > djikstra_heap;

现在您可以推动边缘并获得最小值。

edge e1{ 1, 2, 2 };
edge e2{ 1, 3, 4 };

djikstra_heap heap;
heap.push(e1);
heap.push(e2);
edge first_result = heap.top(); heap.pop();

【讨论】:

  • 非常感谢
猜你喜欢
  • 2021-08-30
  • 2015-05-07
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多