ヒープと優先度キューは同義語であるといつも思っていました-insert
、findMin
およびdeleteMin
操作をサポートする抽象的なデータ構造。
一部の文献は私に同意しているようです-たとえば、Chris Okasakiの純粋に機能的なデータ構造(第3章)。
一方、Wikipediaの heap ページでは、ツリーベースのデータ構造として定義されており、ヒープは優先度キューの具体的な実装であると述べています。
私はこれを、複数のヒープ実装を考えることができるという事実との和解に苦労しています-左派ヒープ、二項ヒープ、スプレイヒープ...
ヒープが異なるデータ構造で実装できるという単純な事実は、定義により、それが抽象的なデータ構造であることを意味しませんか?それが事実である場合、優先キューと実際の違いはありますか?
優先キューには、ポップ時に線形検索する配列など、任意の実装を含めることができます。つまり、ポップすると、最小値または最大値に応じた値が得られるということです。
一般的に参照されるクラシックヒープは、通常、最小ヒープです。時間の複雑さ(PushおよびpopでO(log n)
)があり、メモリオーバーヘッドがない実装。
このウェブサイトは本当に明確な説明を提供します。 http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html
つまり、優先度キューは、これまでに調べたデータ構造の多く(配列、リンクリスト、またはバイナリ検索ツリー)を使用して実装できます。ただし、これらのデータ構造は、最も効率的な操作を提供しません。すべての操作を非常に効率的にするために、ヒープと呼ばれる新しいデータ構造を使用します。
具象と抽象について書いたことは正しいと思います。ただし、スプレイヒープ、2項式ヒープはヒープの実装が異なると言う場合、それらは異なる種類のヒープであると言う方が正しいと思います。ヒープは、通常、同じインターフェイスだけでなく、同じアクセス時間も保証する実装のカテゴリと考えています。
これは、連想マップ、ハッシュテーブル、およびバイナリ検索ツリーでも確認できます。 Bstとハッシュテーブルはどちらも、連想マップの抽象インターフェイスを提供する具体的なデータ構造です。赤黒木とavlツリーは両方ともバランスのとれたbstであり、同じ大きなO保証と同じ追加のインターフェース(順序どおり)があります。それらは、ツリーのさまざまな実装よりも、さまざまなタイプのツリーです。それらは異なりますが、関連性の高い連想マップの実装です。