dijkstra算法的优先级队列

时间:2013-12-26 05:21:08

标签: c++ dijkstra

优先队列如何运作? 我开始研究Dijkstra的算法,用Google搜索并获得了很多代码,其中不同的编码器使用不同版本的优先级队列。 在一个代码中,我注意到他使用了这个声明

priority_queue <pii, vector <pii>, comp> Q;
//pii means pair <int,int>
// And comp is compare structure  which I also cannot understand 

Comp就像这样

struct comp {
  bool operator() (const pii &a, const pii &b) {
    return a.second > b.second;
  }
};

有人可以解释一下这里发生了什么吗?在c ++中还有多少版本的priority_queue声明?

3 个答案:

答案 0 :(得分:1)

C ++优先级队列是:

template <class T, class Container = vector<T>,
  class Compare = less<typename Container::value_type> > class priority_queue;

在此:

T是要存储在队列中的类型;希望这很明显。

Container是队列中的底层存储。如声明所示,默认为std::vector<T>,通常可以忽略它。

Compare' is the method for determining the ordering in the queue. Again, it has a default and can often be ignored. Compare`是一个支持函数调用的类型,它可以比较队列中的两个元素并确定它们的顺序。

less是默认值,只需应用普通<运算符即可。

当需要除<定义的排序之外的其他排序时,可以定义提供所需比较的类型。你有:

struct comp {
  bool operator() (const pii &a, const pii &b) {
    return a.second > b.second;
  }
};

注意这需要两个pii,并使用>运算符进行比较;这与队列中的默认排序相反。

然后将此comp类型指定为模板的第三个参数。

指定了第三个参数,然后使用模板和函数一样,即使我们只想要与默认值std::vector<pii>相同,也必须指定第二个参数。

为什么指定底层容器?这是container adaptor模式。这个想法是优先级队列的语义不一定意味着数据存储的基本方式。如果数据结构专门关注存储,标准也提供了一个数字。因此,为什么不让priority_queue允许选择底层存储?这是适配器概念。

答案 1 :(得分:0)

答案 2 :(得分:0)

如果您阅读priority_queue的引用,您可以看到第一个参数是类型,第二个参数是容器,第三个参数是比较类。另外据我所知,C ++标准中只有一个优先级队列,我使用二叉搜索树实现了自己的自定义队列,这是我推荐的非常有用的练习。

在zobayer博客的Dijkstra算法示例中,由于在代码中使用了宏,所以这有点混淆。令人遗憾的是,这段代码非常模糊,因为它使代码更难以遵循。

comp类(结构是默认情况下所有成员都是public的类)operator()只接受pii对中的第二项并将其与另一个pii进行比较。您可以根据优先级队列中的类型自定义它。