ヒープと優先度キューの違い


36

私は常に、ヒープと優先度キューは同義語であると考えていました- insertfindMinおよびdeleteMin操作をサポートする抽象的なデータ構造。

たとえば、Chris OkasakiのPurely Functional Data Structures(第3章)など、いくつかの文献が私と一致しているようです。

一方、ウィキペディアのヒープページでは、ツリーベースのデータ構造として定義されており、ヒープは優先キューの具体的な実装であると述べています。

私は、これを複数のヒープ実装(左翼ヒープ、二項ヒープ、スプレイヒープ)を考えることができるという事実と調和させるのに苦労しています...

ヒープを異なるデータ構造で実装できるという単純な事実は、定義により、それが抽象データ構造であることを意味しませんか?そして、その場合、優先度キューと実際の違いはありますか?


11
優先度キュー(en.wikipedia.org/wiki/Priority_queue)でウィキペディアのページを読んで、「優先度キューはヒープまたは順序付けられていない配列などのさまざまなメソッドで実装できる」と書かれており、それが実際の答えですあなたの質問。
Doc Brown 14

2
そうではありません-ヒープが具体的なデータ構造なのか、抽象的なデータ構造なのかを理解するのに役立ちません。ヒープには多くの具体的な実装があるため、抽象的なものを言う傾向があります。その場合、優先順位リストとヒープは両方とも同じプロパティを持つ抽象的なデータ構造である場合、違いを理解するのに助けが必要です。具体的な実装。
ニコラスリナウド14

さらに悪いことに、バイナリヒープは配列またはバイナリツリーとして実装できます。幸いなことに、私は他の何かとして実装された配列についてまだ聞いていません。
アレクセイ

回答:


25

優先キューには、ポップ時に線形的に検索する配列など、任意の実装を含めることができます。つまり、ポップすると、最小または最大に応じて値が取得されるということです。

通常参照されるクラシックヒープは、通常、最小ヒープです。時間の複雑さ(O(log n)プッシュおよびポップ時)が良好で、メモリオーバーヘッドのない実装。


4
あなたは(違いは、彼らが同じ操作を共有しながら、ということであると言うことを意味するかfindMindeleteMininsertプライオリティキューがない場合)、ヒープは、彼らのために「良い」複雑さを保証していますか?
ニコラスリナウド14

ヒープは、異なる時間の複雑さ(たとえば、通常のリンクされたバイナリツリー)を持つ異なる実装を持つこともできませんか?また、時間の複雑さは、使用されるメモリによって異なります。磁気テープの場合O(log(n))、プッシュとポップはありません。
アレクセイ

6

このウェブサイトは本当に明確な説明を提供します。 http://pages.cs.wisc.edu/~vernon/cs367/notes/11.PRIORITY-Q.html

要するに、優先度キューは、既に調査した多くのデータ構造(配列、リンクリスト、またはバイナリ検索ツリー)を使用して実装できます。ただし、これらのデータ構造は、最も効率的な操作を提供しません。すべての操作を非常に効率的にするために、ヒープと呼ばれる新しいデータ構造を使用します。


1
リンクしたページの概要では、優先度キュー自体はデータ構造と呼ばれます
アレクセイ

2

具体的と抽象的について書いたことが正しいと思います。スプレイヒープ、二項ヒープはヒープの異なる実装であると言いますが、異なるタイプのヒープであると言う方が正しいと思います。ヒープは、同じインターフェイスだけでなく、同じアクセス時間も一般に保証する実装のカテゴリと考えています。

これは、連想マップ、ハッシュテーブル、バイナリ検索ツリーでも確認できます。Bstとハッシュテーブルは両方とも、関連マップ抽象インターフェイスを提供する具体的なデータ構造です。赤黒木とavl木はどちらもバランスのとれたbstであり、同じ大きなOの保証と同じ追加のインターフェイス(順番にトラバーサル)があります。それらは異なる種類のツリーであり、異なる実装のツリー以上のものです。これらは異なりますが、関連マップの密接に関連する実装です。

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