c ++映射到min heap

时间:2016-08-02 20:13:02

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

我想知道获取(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找到最小元素时,它会返回值而不是键,即这也需要。

请建议以最快的方式执行此问题。 我也相信,有些方法可能超出我的知识范围。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

假设您已经在某处定义了边缘。我们说

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

你需要一个堆,根据文档应该基于vector或deque。我通常喜欢矢量,但我把deque放在这里只是为了好玩。文档说如果你想要一个小堆,请使用std :: greater,因此你也必须实现edge :: operator&gt;

#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();