Я только что заметил что-то, и мне интересно, есть ли причина для этого. За исключением C ++ (std :: priority_queue - это максимальная куча), я не знаю другого языка, который предлагает максимальную кучу.
Модуль Python heapq реализует двоичную минимальную кучу поверх списка.
Библиотека Java содержит класс PriorityQueue, который реализует очередь min-priority.
Библиотека Go содержит модуль контейнера / кучи, который реализует минимальную кучу поверх любой совместимой структуры данных.
Основа Apple Core Foundation содержит структуру CFBinaryHeap, которая реализует минимальную кучу.
Я считаю, что максимальная куча более интуитивна, чем минимальная куча, и я считаю, что технически разница в реализации - это только вопрос смены оператора сравнения. Есть ли реальная причина? Большинству приложений нужна минута, а не максимальная куча? заранее спасибо
источник
std::not2(std::less<T>())
.Ответы:
Как заметили другие, если куча принимает компаратор, то не слишком сложно получить одно или другое поведение. Однако быстрое изучение Google Code позволяет предположить, что минимальная куча гораздо более распространена в реальном коде из-за двух приложений, которые появляются снова и снова.
Dijkstra / A * / многие другие алгоритмы кратчайшего пути (потому что частичные пути становятся длиннее).
Симуляция событий (потому что время идет вперед).
Кроме того, я бы сказал, что из-за сортировки по умолчанию элементы возвращаются от маленького к большому, так же как и куча по умолчанию.
источник
Это просто вопрос вкуса. Я не думаю, что будет какая-то конкретная причина. Точно так же, как некоторым людям нравится выражать проблемы оптимизации как минимизацию затрат, в то время как другим нравится максимизировать прибыль.
источник
Большинство языков, которые я знаю, позволяют передавать параметр, чтобы решить, должна ли это быть минимальная или максимальная куча. Таким образом, значение по умолчанию является несколько произвольным. Я предполагаю, что для большинства языков это вопрос согласованности, чтобы определить, что является оператором по умолчанию. Для C ++ в stl значение по умолчанию
std::less
приводит к минимальной куче.Последовательность использования
std::less
везде по умолчанию означает, что вам нужно реализовывать это сравнение только тогда, когда вы используете какую-либо структуру данных, и вам не нужно решать, какую структуру данных вы собираетесь использовать позже при разработке ваших классов. Я предполагаю, что то же самое относится и к другим языкам, с той лишь разницей, что сравнение больше, чем стандарт.источник
По сути, значение индекса является произвольным числом. Если вы считаете, что число представляет приоритет, а большие числа являются более высокими приоритетами, тогда имеет смысл использовать максимальную кучу. Но если числа представляют собой, например, концептуальные пекарские числа («Возьми число»), тогда min-heap имеет больше смысла.
Вы всегда можете конвертировать из одного в другое, взяв 1 дополнение индекса.
источник