web-dev-qa-db-ja.com

2つの最大ヒープをマージするためのアルゴリズム?

配列として格納されている2つの最大ヒープをマージするための効率的なアルゴリズムはありますか?

24
ThP

ヒープの種類によって異なります。

すべてのノードに最大2つの子があり、リーフが最大2つの異なる行にあることでいっぱいになる標準ヒープの場合、マージでO(n)を超えることはできません。

2つの配列を組み合わせて、O(n)をとる新しいヒープを作成するだけです。

マージのパフォーマンスを向上させるには、フィボナッチヒープのような別のヒープバリアントを使用して、O(1)償却でマージすることができます。

pdate:挿入にはO(log(n))が必要なため、最初のヒープのすべての要素を2番目のヒープに1つずつ、またはその逆に挿入する方が悪いことに注意してください。あなたのコメントが述べているように、あなたはヒープが最初にどのように最適に構築されているかを知らないようです(これも標準のバイナリヒープの場合)

  1. 配列を作成し、両方のヒープの要素を任意の順序で配置します
  2. 今、最低レベルから始めます。最下位レベルにはサイズ1の些細な最大ヒープが含まれているため、このレベルが実行されます
  3. レベルを上げます。 「サブヒープ」の1つのヒープ条件に違反した場合は、「サブヒープ」のルートをより大きな子と交換します。その後、レベル2が行われます
  4. レベル3に移動します。ヒープ条件に違反した場合は、前と同じように処理します。大きい子と交換し、すべてがレベル3に一致するまで再帰的に処理します
  5. .。
  6. 一番上に到達すると、O(n)に新しいヒープが作成されます。

ここでは証明を省略しますが、ヒープ条件を再確立するために多くのコンテンツを交換する必要がなかった最下位レベルでヒープのほとんどを実行したので、これを説明できます。すべての要素をヒープの1つに挿入する場合よりもはるかに優れた、はるかに小さな「サブヒープ」を操作しました=>次に、O(n)毎回。

更新2:二項ヒープはO(log(n))でのマージを許可し、O(log(n)^ 2)要件に準拠します。

16
Etan

サイズnとkの2つのバイナリヒープは、O(log n * log k)比較でマージできます。見る

Jörg-R.SackおよびThomas Strothotte、ヒープをマージするためのアルゴリズム、Acta Informatica 22(1985)、172-186。

9
A. Rex

この場合に探しているのは二項ヒープだと思います。

二項ヒープは、マージ可能なヒープファミリのメンバーである二項ツリーのコレクションです。ヒープ内に合計n個のアイテムがある2+二項ヒープでの和集合(マージ)の最悪の実行時間はO(lg n)です。

詳細については、 http://en.wikipedia.org/wiki/Binomial_heap を参照してください。

1
jfrattarola