Чому більшість мов забезпечують міні-купу замість реалізації max-heap?


19

Я просто щось помітив, і мені цікаво, чи є причина для цього. За винятком C ++ (std :: prior_queue - це максимальна купа), я не знаю жодної іншої мови, яка пропонує максимальну купу.

Модуль heapq Python реалізує двійкову міні-купу вгорі списку.

Бібліотека Java містить клас PriorityQueue, який реалізує чергу мінімуму-пріоритету.

Бібліотека Go містить контейнер / кучу модулів, який реалізує міні-купу поверх будь-якої сумісної структури даних.

Ядро Apple Foundation Foundation містить структуру CFBinaryHeap, яка реалізує міні-купу.

Я вважаю, що max-heap більш інтуїтивний, ніж min-heap, і я вважаю, що технічно різниця в реалізації полягає лише в питанні зміни оператора порівняння. Чи є якась реальна причина? Більшість програм потребує хв замість максимуму купи? Спасибі заздалегідь


Хіба вони не те саме? Я голосую за закриття як аргументативний.

2
Всього пару днів тому мені знадобилося мінімум купи в C ++, і я трохи роздратувався тим, що за замовчуванням максимум купив максимум. Це змусило мене визначити оператора> на моєму спеціальному класі, в якому вже був оператор <. Працюючи з графіками, ти, як правило, хочеш розставити пріоритети найкоротшим краям, тому потрібен хв.
LaC

2
@LaC: ви можете використовувати std::not2(std::less<T>()).

Відповіді:


9

Як зауважували інші, якщо купа приймає компаратор, то отримати таку чи іншу поведінку не надто важко. Однак швидке ознайомлення з кодом Google говорить про те, що min-heap набагато переважає фактичний код через два додатки, які з’являються знову і знову.

  • Dijkstra / A * / багато інших алгоритмів найкоротших шляхів (оскільки часткові шляхи стають довшими).

  • Моделювання подій (адже час йде вперед).

Крім того, я заперечую, що оскільки сортування за замовчуванням повертає елементи малих до великих, так це має бути і за замовчуванням.


2
Зазвичай я програмую на C ++ і дивуюсь навпаки: чому C ++ не реалізує min-heap? Як ви вже говорили, більшість алгоритмів використовують міні-купу.
Мартін Фіксман

5

Це лише питання смаку. Я не думаю, що буде якась конкретна причина. Це так само, як деякі люди люблять виражати проблеми оптимізації як мінімізацію витрат, а інші, як кажуть, максимізують прибуток.


3

Більшість мов, які я знаю, дозволяють передавати параметр, щоб вирішити, чи він повинен бути міні-чи макси-куч. Тож значення за замовчуванням дещо довільне. Я думаю, що для більшості мов це питання послідовності визначення того, що таке оператор за замовчуванням. Для C ++ у stl за замовчуванням std::lessведе до міні-купи.

Послідовність використання std::lessза замовчуванням скрізь означає, що вам потрібно реалізувати це порівняння лише тоді, коли ви використовуєте будь-яку структуру даних, і вам не потрібно вирішувати, яку структуру даних ви будете використовувати пізніше, коли розробляєте свої класи. Я б припустив, що це так само і для інших мов, з тією лише різницею, що порівняння є більшим порівняно зі стандартом.


3
Я не думаю, що існує такий зв'язок. Ви можете реалізувати будь-який тип купи за допомогою <або>. Дійсно, std :: less є типовим для STL, але вони реалізують максимальну купу замість min heap.
LaC

1

В основному значення індексу є довільним числом. Якщо ви вважаєте, що число є пріоритетним, а більша кількість є вищими пріоритетами, то макс-купа має сенс. Але якщо цифри представляють, наприклад, концептуальні номери хлібопекарських виробів ("Візьміть число"), то міні-купа має більше сенсу.

Ви завжди можете конвертувати з одного в інший, взявши додаток 1 до індексу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.