抽出を持つ優先度キューが存在しますか?


46

プライオリティキューインターフェイスを実装するデータ構造は非常に多くあります。

  • 挿入:構造に要素を挿入します
  • Get-Min:構造内の最小要素を返します
  • Extract-Min:構造内の最小要素を削除します

このインターフェイスを実装する一般的なデータ構造は、(最小)ヒープです。

通常、これらの操作の(償却)実行時間は次のとおりです。

  • 挿入:(時々Olog n O(1)O(logn)
  • Get-Min:O(1)
  • Extract-Min:O(logn)

フィボナッチヒープは、例えば、これらの実行中の時間を実現します。さて、私の質問は次のとおりです。

次の(償却)実行時間のデータ構造はありますか?

  • 挿入:O(logn)
  • Get-Min:O(1)
  • 抽出分:O(1)

ソートされた入力が与えられたときに時間でそのような構造を構築できる場合、例えば、o nO(n)交差点は、「通常の」優先度キューを使用する場合よりも厳密に高速です。o(nlogn)


私が考えて、それがでしょうバランスの取れたBSTを使用していない抽出-Minは仕事ができるやったときにバランスを取り戻します。または、スキップリストかもしれません。
svick

@svick:スキップリストはランダム化されていますが、これは私が探しているものではありません。あなたがBSTでそれを行うことができるなら、それは素晴らしいことですが、私はあなたが何らかのバランスをとる必要があると思います。
アレックス10ブリンク

補足:これは種まきの質問であり、私はその答えを知っていますが、それがそれほど簡単に解決されないことを見るのは素晴らしいことです。誰もが答えを知っていれば、それを与えることをheしないでください:)
アレックス10ブリンク

償却された更新時間を受け入れている場合は、標準のヒープ構造を維持し、分析にわずかな変更のみを加えることができます。以下の私の答えをご覧ください。
ジョー

回答:


27

私たちのアイデアはスレッド 化されたスプレイツリーを使用することです。Wikipediaの記事以外に、ツリーをスレッド化して、すべてのノードがnext順序トラバーサルの後続ノードへのポインターを持つようにします。startツリー内の最小要素へのポインタも保持します。

(最悪の場合)時間最小の要素を抽出できることは簡単にわかります。ポインタをたどり、最小値を削除して、最小値にポインタを変更します。最小値に左の子を含めることはできません。適切な子がある場合は、ツリー内の最小の場所に配置します。スプレイツリーが通常行うスプレイ操作実行しません。 結果は、依然として合理的なバランスのとれた検索ツリーです。左側面のノードのみを削除するため、(影響を受けるサブツリー内の)ノードの数が削除により元の数の約半分に減少すると、(sub )木の高さは1つ減ります。O(1)startnext

挿入は償却時間で可能です。ここでは、ジグザグ(およびそうでない)操作によってツリーのバランスがうまく調整されます。O(logn)

これはせいぜいラフなスケッチです。クレジットは、私と一緒に質問について困惑したF.ワインバーグと、私たちが試したことがなかった唯一のツリーバリアントについて、スプレイツリーについて言及したアドバイザーのM.ネベルに与えられます。


2
extractMinを表示しない場合、償却分析を機能させる方法は明確ではありません。ヒントを教えてください。
jbapple

詳細には行っていません。アイデアは、一連の抽出-最小操作によってツリーのバランスが崩れないため、スプレイは不要であり、通常の分析は挿入に対して機能するはずです。
ラファエル

9
気をつけて!スプレイツリーは必ずしもバランスが取れていません。長時間アクセスされていないノードは、ツリーの非常に深いところにある可能性があります。分析が通過させるために、あなたは持っている splaysを分析するために使用したのと同じポテンシャル関数の観点から議論します。
-JeffE

20
  • 挿入:O(logn)
  • Get-Min:O(1)
  • 抽出分:O(1)

償却時間

cnlognO(logn)O(logn)Ω(logn)O(1)

最悪の場合

文献の既存のデータ構造であるフィンガーサーチツリーを使用して、最小要素へのポインタを維持することができます。概要についてはこの調査を、また、ニーズを満たす実装可能なバージョンについてはLevcopoulos and Overmarsによる1988年の論文をご覧ください。


1
とても卑劣です。あなたは正しい、私はこれを排除するためにもっと強い何かを要求すべきだったと思う。良いアイデア:)
アレックス10ブリンク

O(1)


8

要求によって、質問を作成した後に見つけた構造は次のとおりです。

基本的な考え方は、スレッド化された Scapegoatツリーを最小値へのポインタとともに使用することです(適切な測定のために、最大値も同様に)。スレッド化のより単純な代替方法は、すべてのノードで先行および後続のポインターを維持することです(同等で、より単純ですが、オーバーヘッドが大きくなります)。単に名前を付けるために、Scapegoat heapと呼ぶようになりました。

この基本構造だけで、次の操作が可能になります。

  • O(logn)
  • O(logn)
  • O(1)
  • Get-Min / Max:ポインターを最小または最大に戻します。

O(logn)O(1)O(logn)O(1)O(1)O(1)

  • O(1)

これを組み合わせる:

  • O(1)

ポインターを使用してもう少し行うことができます。たとえば、中央値または他の順序統計へのポインターを維持するのは難しくないので、必要な場合は一定数のポインターを維持できます。

その他のこと:

  • nO(n)
  • O(n)

最後に、これらの操作をサポートできると確信していますが、これを確実に知る前に、これらについてもう少し考える必要があります。

  • O(1)

キーの洞察力は、そのスケープゴートの木が任意のノードを削除することを保証されずに、あなたが多くのノードを削除しても、リバランスは長期的には他の操作のパフォーマンスに影響を与えません。
ラファエル

O(lgn)O(1)O(lgn)

2
O(1)O(1)O(1)O(1)
アレックス10ブリンク

ああ、私は今理解しています。
jbapple

2

ϵO(1)log(1/ϵ)ϵ

ϵn

元の明確できれいに書かれた論文については、Bernard Chazelle、The Soft Heap:An Approximate Priority Queue with Optimal Error Rate、Journal of the ACM、47(6)、pp.1012-1027、2000を参照してください。SODA'09からよりシンプルで直感的であると主張する代替の実装と分析については、2009年のChazelleのソフトヒープのより単純な実装と分析、Kaplan H.&Zwick U.を参照してください。


非常に興味深いデータ構造ですが、ソフトヒープは正確ではありません。findminは最小値ではなく、おおよその最小値を返す場合があります。とにかくリンクをありがとう:)
アレックス10ブリンク

1
@AlextenBrink:(多くの確率的アルゴリズムのような)データ構造のポイントは、正確な答えを得るために近似データ構造を使用できることです。実際、ソフトヒープのおおよその性質は、最小スパニングツリーの唯一の既知の線形時間アルゴリズムで使用されることを妨げませんでした。
ジェレミー

2

さて、最終的にあなたが探していた複雑さを手に入れました、そして最高のものは、文献で見つけました:

最悪の複雑さ

O(1)

O(1)

O(1)

O(log n)

参照

[3]O(1)O(log n)O(n)

Brodal、GerthStølting。「高速メルダブル優先度キュー」。第4回アルゴリズムとデータ構造に関する国際ワークショップの議事録、282–290。WADS '95。ロンドン、イギリス、イギリス:スプリンガー出版、1995

[3]Dietz、Paul F、およびRajeev Raman。「一定の更新時間のフィンガー検索ツリー」。情報処理手紙52、いいえ。3(1994):147 – 154。

これは、計算RAM モデルを使用します

私たちのデータ構造は、ユニットコスト測定と対数ワードサイズを備えたランダムアクセスマシン(RAM)モデルを使用しています。

より最近では、計算ソリューションのPointer-Machineモデルが提供されてい[1]ます。

[1]Brodal、GerthStølting、George Lagogiannis、Christos Makris、Athanasios Tsakalidis、Kostas Tsichlas。「ポインターマシンの最適な指検索ツリー」。J.計算 システム。科学 67、いいえ。2(2003年9月):381–418。


2

2つのデータ構造(配列とバイナリツリー)を維持することにより、この問題にアプローチします。

Ω(lognloglogn)Ω(logn)

O(logn)O(logn)

nullO(logn)

O(1)O(1)

O(logn)O(1)delete_at(idx)


1 パトラスク、ミハイ、およびエリックD.デメイン。「セルプローブモデルの対数下限」。SIAMJ. Comput。35、いいえ。4(2006年4月):932–963。doi:10.1137 / S0097539705447256。


1
O(logn)

「バイナリ検索ツリーを配列にスレッド化する」とはどういう意味ですか?
jbapple

@AT:jbappleの感情を共有します。
ラファエル

Ω(k)kO(1)

一定の時間で回転を実装する方法を説明する更新は、配列では機能しません。この答えはまだ間違っています。参照するTarjanの論文は、ノードとポインターで保存されたツリーに関するものです。
jbapple

-2

O(1)O(log log n)

2007年の論文:優先度キューと Mikkel Thorupによる並べ替えの同等性を参照してください。

O(n log log n)


リンクした論文は興味深いものですが、それらが提示する優先度キューには一定の時間の削除がないため(要約を正しく読んだ場合)、したがって、私が求めているものではありません。
アレックス10ブリンク

-2

分析

o(n log log n)

o(log log n)

O(1)

O(n)

O(1)

O(1)

実装

  1. O(1)
  2. O(6)O(1)
  3. k±
    ((k>nsize1)(k<n0)((k<ni)(k>ni+1)))
    o(log log n)

[1]:Andersson、Arne、およびChrister Mattsson。「O(log log n)時間での動的補間検索」。オートマタでは、言語とプログラミング、Andrzej Lingas、Rolf Karlsson、およびSvante Carlssonによる編集、700:15–27。コンピュータサイエンスの講義ノート。スプリンガー、ベルリン/ハイデルベルグ、1993年http://dx.doi.org/10.1007/3-540-56939-1_58


2
さて、挿入時間は予定から外れています。
ラファエル

nsize1n0nini+1

リンクする論文の要約を読むと、これらの境界は特定の分布の入力の予想される境界であるように思われるため、私が探しているものではありません。
アレックス10ブリンク

O(log n)

@AT対数バイナリ検索にはランダムアクセスが必要です。基礎となるリストは何として実装されていますか?自分の主張する境界について本当に議論すべきです。また、「リスト内の位置」はあいまいです。シンボルはどの位置にあり、何を参照していますか?リンクした論文に誰もがアクセスできるわけではありません。回答を(もっと)自己完結させ、少なくとも事実を要約してみてください。この時点で、あなたの答えが正しいとは思いません。
たJuho
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.