ソートされた配列に対するヒープの利点は何ですか?


7

私はヒープにかなり慣れていないので、ソートされた配列がデフォルトで最小/最大プロパティを提供しているように見えるときに、最小ヒープと最大ヒープがツリーとして表される理由に頭を抱えようとしています。

そしてフォローアップ:クイックソートのようなアルゴリズムがソートを非常にうまく処理する場合、ヒープへの挿入の複雑さを処理する利点は何ですか?

コンテキスト:私はPythonでCLRS / MIT 6.006を使用していて、葉の値の整数表現しか見ていません。これは、各リーフに簡単にソートできない構造体が含まれているCなどの言語でより適切ですか?


2
ヒープは通常、ツリーとしてモデル化れますが、提案した方法でない場合は、配列として実装されることに注意してください。
ラファエル

回答:


14

find-min (それぞれ find-max)、 delete-min (それぞれ delete-max)および insert は、最小ヒープ(または最大ヒープ)の最も重要な3つの操作であり、通常、 O(1)O(logn) そして O(logn) バイナリツリーで最小/最大ヒープを実装する場合は、それぞれ。


代わりに、ソートされた(減少しない)配列によって最小ヒープを実装するとします(最大ヒープの場合も同様です)。 find-min そして delete-minO(1) 複雑さ insert ポインタを維持できるため、アプリケーションでは必要ありません pこれは常に配列の最小要素を指します。最小要素が削除されたら、移動するだけですp 配列の次の要素への1ステップ。

ソートされた配列への挿入の扱いは簡単ではありません。新しい要素が与えられたe、バイナリ検索を使用して配列内の位置を特定し、挿入することができます。しかし、ポイントは、そこに挿入したい場合、多くの古い要素を移動する必要があるということです(O(n))新しい要素が存在するための空席を作るために周り。これはほとんどのアプリケーションにとって非常に非効率的です。要素が挿入された後に配列を再ソートすることもできます。これには、O(nlogn) 時間。


最後のポイントは、データ構造を実装する方法は、実際にはアプリケーションによって異なります。NO、単一の実装では、すべての場合に最適です。アプリケーションを分析し、最も頻繁な操作を見つけて、適切な実装を決定します。


1
また、連続する配列で新しい要素を追加することは、O(n)よりも速く行うことはできません。これは、n個までの要素が間違った場所にあり、何をしても別の場所に移動する必要があるためです。
gnasher729 2016

そうですか。@ NP-hardしたがって、ソートされた配列のヒープを表す主な利点は、最小値/最大値へのアクセス時間ですが、欠点は「スペースを作る」ことによる挿入です。逆に、並べ替えられていない配列として表されたヒープは、ヒーププロパティが再び満たされるまで要素を交換するだけでよいため、挿入の利点がありますが、find-min/ find-maxat O(log n)の欠点がありますか?
Nick Olinger

1
@LindyHopはい。これはトレードオフです。だがfind-min 必要なのは O(1)時間; それはdelete-min それが必要 O(logn)時間。
PSPACEhard 2016

5

質問に答えるには、実行するさまざまなアクションとその頻度を定義し、各アクションの時間の複雑さを評価する必要があります。

全体的にパフォーマンスが高い方法は、個々の複雑さと、各アクションが実行される頻度によって異なります。

配列の並べ替えは、非常に複雑です。ヒープ操作は非常に安価であるため、実際には適切なソートの実装に使用されます。ヒープを使用して最小の要素を見つける方が、配列をソートするよりもはるかに高速です。最小要素と最大要素の2つのヒープは、はるかに高速です(ただし、そのような状況は非常にまれです。たとえば、競馬では誰もが勝者を知りたがりますが、誰が最後に来るかは気にしません)。

ヒープが完全にソート配列を完全に打つ場合とは、少数のアイテムが削除または追加される状況であり、変更のたびに、どちらが最小の要素であるかを再度知りたい場合です。


これは非常に役立ちます。たくさんの検索/最小限の挿入を必要とする実装は、ソートされた配列ヒープとして実装するのが最善のようです。ただし、挿入が多いシナリオは、ソートされていない配列ヒープ/バイナリツリーに最適です。
Nick Olinger
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.