aryヒープd-

D-ary_heap
D進ヒープ又はD -heapあるプライオリティキュー データ構造の一般バイナリヒープノードが持っているD子供の代わり2. このように、バイナリヒープは2 -ヒープ、および3値ヒープは3ヒープです。Tarjanによれば、及びジェンセンら、 D進ヒープは、によって発明されたドナルド・B・ジョンソン1975年
このデータ構造により、削除の最小操作が遅くなりますが、優先度の低い操作をバイナリヒープよりも迅速に実行できます。このトレードオフにより、ダイクストラのアルゴリズムなどのアルゴリズムの実行時間が短縮されます。このアルゴリズムでは、最小削除操作よりも優先度の低い操作の方が一般的です。 さらに、d- aryヒープは、バイナリヒープよりもメモリキャッシュの動作が優れているため、理論的に最悪の場合の実行時間が長くても、実際にはより高速に実行できます。 バイナリヒープと同様に、d – aryヒープはインプレースデータ構造です。ヒープ内のアイテムの配列を格納するために必要なストレージを超える追加のストレージを使用しません。
内容
1 データ構造
2 分析
3 アプリケーション
4 参考文献
5 外部リンク
データ構造
D進ヒープから成るアレイのN、それに関連付けられた優先度をそれぞれ有するアイテム。これらのアイテムは、幅優先探索の順序でリストされた完全なd- aryツリーのノードと見なすことができます。配列の位置0のアイテム(ゼロベースの番号付けを使用)はツリーのルートを形成し、位置1のアイテムはスルーD子、次さD 2つの項目は、その孫である、等したがって、位置の項目の親I(いずれかのためにI > 0)の位置に項目である⌊(I – 1)/ D ⌋と子は、位置di +1からdi + dにあるアイテムです。ヒーププロパティによると、最小ヒープでは、各アイテムの優先度は少なくともその親と同じです。最大ヒープでは、各アイテムの優先度は親よりも大きくありません。
最小ヒープ内の最小優先度項目(または最大ヒープ内の最大優先度項目)は、常に配列の位置0にこのアイテムを優先キューから削除するには、配列の最後のアイテムxをその場所に移動し、配列の長さを1つ減らします。次に、アイテムxとその子がヒーププロパティを満たさない場合、アイテムxはその子の1つ(最小ヒープで優先度が最小の子、または最大ヒープで優先度が最大の子)と交換されます。 、最終的にヒーププロパティが満たされるまで、ツリー内で下に移動し、後で配列内で移動します。同じダウンスワッピング手順を使用して、最小ヒープ内のアイテムの優先度を上げたり、最大ヒープ内のアイテムの優先度を下げたりすることができます。
新しいアイテムをヒープに挿入するには、アイテムを配列の最後に追加します。次に、ヒーププロパティに違反している間、そのアイテムは親と交換され、ツリー内で上に移動し、最終的には配列内で前に移動します。ヒーププロパティが満たされています。同じ上向きスワッピング手順を使用して、最小ヒープ内のアイテムの優先度を下げたり、最大ヒープ内のアイテムの優先度を上げたりすることができます。
n個のアイテムの配列から新しいヒープを作成するには、位置n − 1のアイテムから始まり、位置0のアイテムで終わる逆の順序でアイテムをループし、各アイテムに下向きのスワップ手順を適用します。
分析
でDと進ヒープNそれの項目、上方スワップ手順と下方スワップ手順の両方は、多くのように実行することができるログD N =ログNログ/ Dスワップ。上方スワップ手順では、各スワップはアイテムとその親との単一の比較を含み、一定の時間がかかります。したがって、新しいアイテムをヒープに挿入する時間、最小ヒープ内のアイテムの優先度を下げる時間、または最大ヒープ内のアイテムの優先度を上げる時間は、O(log n / log d)です。ダウンスワッピング手順では、各スワップにはd回の比較が含まれ、O(d)時間がかかります。子の最小または最大を決定するためにd − 1回の比較が必要であり、次にスワップが必要かどうかを決定するために親に対してもう1回比較が必要です。 。したがって、ルートアイテムを削除する時間、最小ヒープ内のアイテムの優先度を上げる時間、または最大ヒープ内のアイテムの優先度を下げる時間は、O(d log n / log d)です。
n個のアイテムのセットからd- aryヒープを作成する場合、ほとんどのアイテムは、最終的にd- aryツリーの葉を保持する位置にあり、それらのアイテムに対して下向きのスワップは実行されません。最大でn / d + 1のアイテムは非葉であり、交換する子を見つけるためにO(d)時間のコストで、少なくとも1回は下向きに交換できます。最大でn / d 2 + 1ノードを2回下方にスワップでき、第1項ですでにカウントされているコストなどを超える2回目のスワップの追加のO(d)コストが発生します。したがって、作成にかかる合計時間このようにヒープは∑ 私 = 1 ログ d n
(( nd 私 + 1 )O
(( d) = O (( n
) { 画像注釈 sum _ {i = 1} ^ { log _ {d} n} left({ frac {n} {d ^ {i}}} + 1 right)O(d)= O( n)。}
  上記の正確な値(d-aryヒープの構築中の最悪の場合の比較数)は、次の値に等しいことがわかっています。 d d − 1
(( n− s d (( n) ) − (( d− 1 − (( n
モッドd ) ) (( e d (( ⌊n d ⌋ ) + 1 ) { 画像注釈 { frac {d} {d-1}}(n-s_ {d}(n))-(d-1-(n { bmod {d}})) left(e_ {d} left( left lfloor { frac {n} {d}} right rfloor right)+1 right)}

 、
ここで、s d(n)はnの標準のbase-d表現のすべての桁の合計であり、e d(n)はnの因数分解におけるdの指数です。これはに減少します2 n − 2 s 2 (( n) − e 2 (( n ) { 画像注釈 2n-2s_ {2}(n)-e_ {2}(n)}

 、
d = 2の場合、および 3 2
(( n− s 3 (( n) ) − 2 e 3 (( n) − e 3 (( n− 1 ) { 画像注釈 { frac {3} {2}}(n-s_ {3}(n))-2e_ {3}(n)-e_ {3}(n-1)}

 、
d = 3の場合。
挿入および削除最小操作を使用したd – aryヒープのスペース使用量は、ヒープ内の項目のリストを含む配列以外の追加のストレージを使用しないため、線形です。 既存のアイテムの優先順位の変更をサポートする必要がある場合は、アイテムからヒープ内の位置へのポインターも維持する必要がこれも線形ストレージのみを使用します。
アプリケーション
上で動作するとき、グラフとMのエッジとN頂点、両方のダイクストラ法のための最短経路とプリム法のための最小全域木がされた分ヒープ使用N削除分の操作などの多くのようなm個の減少優先度動作を制御します。d = m / nのd – aryヒープを使用することにより、これら2つのタイプの操作の合計時間は互いにバランスが取れ、アルゴリズムの合計時間はO(m log m / n n)になります。エッジの数が頂点の数よりも大幅に多い場合は常に、これらのアルゴリズムのバイナリヒープバージョンのO(m log n)実行時間よりも改善されています。 代替の優先度キューデータ構造であるフィボナッチヒープは、O(m + n log n)の理論上の実行時間をさらに改善しますが、実際には、d- aryヒープは一般に少なくとも同じくらい高速であり、多くの場合このアプリケーションのフィボナッチヒープよりも高速です。
4ヒープは、delete-min操作の場合でも、実際にはバイナリヒープよりもパフォーマンスが高い場合が さらに、d- aryヒープは通常、コンピューターのキャッシュメモリのサイズを超えるヒープサイズの場合、バイナリヒープよりもはるかに高速に実行されます。バイナリヒープは通常、dよりも多くのキャッシュミスと仮想メモリ ページ障害を必要とします。 -aryヒープ。それぞれが、バイナリヒープと比較してd- aryヒープが行う追加の比較によって発生する追加の作業よりもはるかに長い時間がかかります。
参考文献
^ a b c d Johnson、DB(1975)、「更新と最小スパニングツリーの検索を伴う優先キュー」、情報処理レター、4(3):53–57、doi:10.1016 / 0020-0190(75)90001-0。 ^ bはCのDのE 、F 、G 、H 、I 、J 、KとL
Tarjan、RE(1983)、 “3.2。dは-heaps”、データ構造とネットワークアルゴリズム、応用数学において、CBMS-NSF地域会議シリーズ44、工業および学会応用数学、pp。34–38 。Tarjanは0ベースの番号付けではなく、1ベースの番号付けを使用するため、0ベースの番号付けを使用する場合は、ノードの親と子の式を調整する必要があることに注意して ^ a b c d e f g h Weiss、MA(2007)、 ” d -heaps”、Data Structures and Algorithm Analysis(2nd ed。)、Addison-Wesley、p。216、ISBN  0-321-37013-9。 ^ Jensen、C。; Katajainen、J。; Vitale、F。(2004)、ヒープに関する拡張された真実(PDF)
。 ^ a b Tarjan(1983)、77および91ページ。 ^ a b Naor、D。; マーテル、CU; Matloff、NS(1991年10月)、「仮想メモリ環境での優先キュー構造のパフォーマンス」、Computer Journal、34(5):428–437、doi:10.1093 / comjnl / 34.5.428 。 ^ a b Kamp、Poul-Henning(2010年6月11日)、「あなたはそれを間違っています」、ACMキュー、8(6) 。 ^ a b モーテンセン、CW; Pettie、S。(2005)、「暗黙的でスペース効率の高い優先キューの複雑さ」、アルゴリズムとデータ構造:第9回国際ワークショップ、WADS 2005、カナダ、ウォータールー、2005年8月15〜17日、議事録、コンピュータサイエンスのレクチャーノート、3608、Springer-Verlag、49〜60ページ、doi:10.1007 / 11534273_6、ISBN  978-3-540-28101-6。 ^ a b c Suchenek、Marek A.(2012)、「フロイドのヒープ構築プログラムの初歩的かつ正確な最悪の場合の分析」、Fundamenta Informaticae、IOS Press、120(1):75–92、doi:10.3233 / FI- 2012-751 。 ^ Cherkassky、Boris V。; ゴールドバーグ、アンドリューV。; Radzik、Tomasz(1996年5月)、「最短経路アルゴリズム:理論と実験的評価」、数学的プログラミング、73(2):129–174、CiteSeerX 10.1.1.48.752、doi:10.1007 / BF02592101  。
外部リンク
Dヒープをサポートする一般化ヒープのC ++実装

投稿日:
カテゴリー: D