ほとんどの言語が最大ヒープ実装ではなく最小ヒープを提供するのはなぜですか?


19

何かに気付いたばかりで、その理由はあるのでしょうか。C ++(std :: priority_queueは最大ヒープ)を除いて、最大ヒープを提供する他の言語は知りません。

Pythonのheapqモジュールは、リストの上にバイナリの最小ヒープを実装します。

Javaのライブラリには、min-priority-queueを実装するPriorityQueueクラスが含まれています。

Goのライブラリには、互換性のあるデータ構造の上に最小ヒープを実装するコンテナ/ヒープモジュールが含まれています。

AppleのCore Foundationフレームワークには、最小ヒープを実装するCFBinaryHeap構造が含まれています。

最大ヒープは最小ヒープよりも直感的であり、技術的には実装の違いは比較演算子を変更するだけの問題だと思います。本当の理由はありますか?ほとんどのアプリケーションでは、最大ヒープではなく最小ヒープが必要ですか?前もって感謝します


それらはまったく同じものではありませんか?私は論争として閉会することに投票します。

2
ほんの数日前、私はC ++で最小ヒープが必要でしたが、priority_queueがデフォルトで最大ヒープになっていることに少し悩みました。カスタムクラスにoperator>を定義する必要がありましたが、このクラスには既にoperator <がありました。グラフを使用する場合、通常は最短エッジを優先するため、最小ヒープが必要です。
LaC

2
@LaC:を使用できますstd::not2(std::less<T>())

回答:


9

他の人が観察したように、ヒープがコンパレータを受け入れる場合、どちらかの動作を取得するのはそれほど難しくありません。ただし、Google Codeを簡単に読んでみると、2つのアプリケーションが繰り返し登場するため、実際のコードではmin-heapがはるかに一般的であることが示唆されています。

  • Dijkstra / A * /その他の最短経路アルゴリズム(部分経路が長くなるため)。

  • イベントのシミュレーション(時間が経過するため)。

また、デフォルトのソートでは小さいから大きいアイテムが返されるため、デフォルトのヒープでも返されるはずだと主張します。


2
私は通常C ++でプログラミングしますが、逆に疑問に思います。なぜC ++はmin-heapを実装しないのですか?あなたが言ったように、ほとんどのアルゴリズムは最小ヒープを使用します。
マルティンフィックスマン

5

それは単なる好みの問題です。特別な理由はないと思います。最適化の問題をコストの最小化と表現したい人もいれば、利益を最大化したと言う人もいます。


3

私が知っているほとんどの言語では、パラメーターを渡して、それが最小ヒープか最大ヒープかを決定できます。そのため、デフォルト値はいくぶん任意です。ほとんどの言語では、デフォルト演算子が何であるかを定義することは一貫性の問題だと思います。stlのC ++の場合、デフォルトではstd::less最小ヒープになります。

std::lessあらゆる場所でデフォルトを使用する一貫性があるということは、あらゆる種類のデータ構造を使用している場合にのみこの比較を実装する必要があり、後でクラスを設計するときに使用するデータ構造を決定する必要はありません。他の言語でも同じですが、大なり比較が標準であるという唯一の違いがあります。


3
私はそのような接続があるとは思わない。<または>を使用して、いずれかの種類のヒープを実装できます。実際、std :: lessはSTLのデフォルトですが、最小ヒープの代わりに最大ヒープを実装します。
LaC

1

基本的に、インデックス値は任意の数値です。数値が優先順位を表し、数値が大きいほど優先順位が高いと思われる場合は、max-heapが理にかなっています。しかし、数字が、たとえば概念的なベーカリー番号(「Take a number」)を表す場合、min-heapはより理にかなっています。

インデックスの1の補数を取ることで、いつでも一方から他方に変換できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.