очередь с приоритетами для алгоритма Дейкстры

0

Как работает очередь приоритетов? Я начал изучать алгоритм Дейкстры, искал его и получил много кода, где разные кодеры использовали разные версии очередей приоритетов. В одном коде я заметил, что он использует это выражение

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;
  }
};

Может ли кто-нибудь объяснить мне, что здесь происходит? Также сколько версий объявлений priority_queue есть в c++?

Теги:
dijkstra

3 ответа

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 является значением по умолчанию и просто применяет обычный < operator.

Когда требуется упорядочение, отличное от того, которое определено <, один определяет тип, который обеспечивает необходимое сравнение. Поскольку у вас есть:

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

Обратите внимание, как это занимает два pii и сравнивается с помощью оператора >; это дает обратное порядку по умолчанию в очереди.

Этот тип comp затем указывается в качестве третьего параметра в шаблоне.

Указав третий параметр, тогда с шаблонами, как и с функциями, необходимо указать второй параметр, хотя мы хотим только то же, что и по умолчанию, std::vector<pii>.

Почему спецификация базового контейнера? Это шаблон container adaptor. Идея состоит в том, что семантика очередей приоритетов не обязательно подразумевает основной способ хранения данных. Также стандарт предоставляет число, если структуры данных специально ориентированы на хранение. Поэтому почему бы не иметь priority_queue, позволяющий выбрать базовое хранилище? Это концепция адаптера.

0

Если вы прочитаете ссылку для priority_queue, вы увидите, что первым аргументом является тип, а второй аргумент - контейнер, а третий - класс сравнения. Кроме того, насколько я знаю, в стандарте C++ есть только одна очередь приоритетов, я реализовал собственную собственную очередь, используя двоичное дерево поиска, которое является очень полезным упражнением, которое я рекомендую.

В примере алгоритма Дейкстры в блоге zobayer это все немного запутано из-за использования макросов в коде. Это позор, что этот код настолько запутан, что он затрудняет выполнение кода.

Класс comp (struct - это класс со всеми членами public по умолчанию) operator() просто берет второй элемент в паре pii и сравнивает его с другим pii. Вы настроили бы это независимо от того, что ваш тип находится в очереди приоритетов.

0

Проверь это

а также проверить этот алгоритм dijkstra - в c++?

  • 0
    На самом деле, я искал помощи с первого сайта ранее. Не могли бы вы сказать мне, как используется вектор внутри объявления? Этот вектор беспокоит меня больше всего здесь. еще раз спасибо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню