複合型であり、部分的にのみ順序付けられている優先順位を持つオブジェクトがいくつかあります。この優先度の順にオブジェクトを選択する必要があります(つまり、毎回最小限のアイテムを生成します)。しかし、注文を勝手に完了するのではなく、キューが安定している場合は、最小要素が複数ある場合に最も古い要素を最初に返す必要があるという意味でキューの方が好ましいと思います。
半順序で機能するヒープデータ構造はありますか?または、それを使用するための通常の優先度キューの変更?私が必要とするアルゴリズムの一般的な選択は、単純なバイナリまたは4進数のヒープですが、それは半順序では機能しません。
優先度の値は次をサポートします。
- 操作usingを使用した順序付け。それがいる可能性がありますので、それは、半順序だ≼ bが偽とあるB ≼もfalseです。私は書く⋚ ̸ Bその場合に。
- 半順序の線形拡張を定義できます。アルゴリズムがそのように機能するため、優先キューに使用するのは簡単な方法です。ただし、順序はパフォーマンスに影響し、挿入の順序は最悪の場合を回避するのに最適であるように見えます。
さらに、これで使用したいアルゴリズムは、キュー内のすべての優先順位の下限を知る必要があります。
優先順位には実際の意味がありますが、変更される可能性があるため、他のプロパティに依存することは現実的ではありません。
注:バイナリヒープは半順序では機能しません。、、およびcのバイナリヒープを想定します。ここでおよびおよびです。それらはこの順序で配置されているため、
a (0)
/ \
b (1) c (2)
ここでdが挿入されます。次の空き位置は3で、bの左の子なので、次のようになります
a (0)
/ \
b (1) c (2)
/
d (3)
場合は(暗示た推移から、しかし、については何も言うことはありませんと)と、そしてと交換されませんそれはあまりありませんので、。しかし、実際には未満です、それと比較されていないため、現在、主要なヒープ不変式は保持されていません。topは最小限ではありません。
私は、二項式ヒープのスタイルのヒープの森が機能する可能性があると考えています。基本的に、新しい値をルートと常に比較し、比較可能な要素のみをリンクすることが重要です。これにより、フォレスト内のツリーのサイズがランダムになり、ヒープ内の相互に比較できないセットの数に応じて複雑さが決まります。複雑さは修正できないと思われます(比較可能な要素に到達するまで比較を続けなければなりません)何かを見落としているかもしれないので、私はこれを開いたままにします。
注:順序は部分的であり、線形拡張を定義する方法はありますが、タイムスタンプを追加して二次基準として使用することはそれらの1つではありません。各タイムスタンプを割り当て、または(および場合、順序をとして定義しとします。その後、我々は明確な持っていると仮定し、、、その結果と。次にし、であるが、であるため、関係は推移的ではないため、順序付けはまったくありません。この種の拡張は弱い順序でのみ機能し、部分的な順序では機能しません。
編集:私は、定義されたセットの無限であるだけでなく、実際にキュー内の現在の要素を効率的に取得できる必要があることに気付きました。そこで、サブツリーの無限大を含む特別なノードを一般的なヒープ構造に追加することが役立つかどうかを検討しています。