配列として格納されている2つの最大ヒープをマージするための効率的なアルゴリズムはありますか?
ヒープの種類によって異なります。
すべてのノードに最大2つの子があり、リーフが最大2つの異なる行にあることでいっぱいになる標準ヒープの場合、マージでO(n)を超えることはできません。
2つの配列を組み合わせて、O(n)をとる新しいヒープを作成するだけです。
マージのパフォーマンスを向上させるには、フィボナッチヒープのような別のヒープバリアントを使用して、O(1)償却でマージすることができます。
pdate:挿入にはO(log(n))が必要なため、最初のヒープのすべての要素を2番目のヒープに1つずつ、またはその逆に挿入する方が悪いことに注意してください。あなたのコメントが述べているように、あなたはヒープが最初にどのように最適に構築されているかを知らないようです(これも標準のバイナリヒープの場合)
ここでは証明を省略しますが、ヒープ条件を再確立するために多くのコンテンツを交換する必要がなかった最下位レベルでヒープのほとんどを実行したので、これを説明できます。すべての要素をヒープの1つに挿入する場合よりもはるかに優れた、はるかに小さな「サブヒープ」を操作しました=>次に、O(n)毎回。
更新2:二項ヒープはO(log(n))でのマージを許可し、O(log(n)^ 2)要件に準拠します。
サイズnとkの2つのバイナリヒープは、O(log n * log k)比較でマージできます。見る
Jörg-R.SackおよびThomas Strothotte、ヒープをマージするためのアルゴリズム、Acta Informatica 22(1985)、172-186。
この場合に探しているのは二項ヒープだと思います。
二項ヒープは、マージ可能なヒープファミリのメンバーである二項ツリーのコレクションです。ヒープ内に合計n個のアイテムがある2+二項ヒープでの和集合(マージ)の最悪の実行時間はO(lg n)です。
詳細については、 http://en.wikipedia.org/wiki/Binomial_heap を参照してください。