infimaで部分的に順序付けられた優先度の優先度キュー


16

複合型であり、部分的にのみ順序付けられている優先順位を持つオブジェクトがいくつかあります。この優先度の順にオブジェクトを選択する必要があります(つまり、毎回最小限のアイテムを生成します)。しかし、注文を勝手に完了するのではなく、キューが安定している場合は、最小要素が複数ある場合に最も古い要素を最初に返す必要があるという意味でキューの方が好ましいと思います。

半順序で機能するヒープデータ構造はありますか?または、それを使用するための通常の優先度キューの変更?私が必要とするアルゴリズムの一般的な選択は、単純なバイナリまたは4進数のヒープですが、それは半順序では機能しません。

優先度の値は次をサポートします。

  1. 操作usingを使用した順序付け。それがいる可能性がありますので、それは、半順序だbが偽とあるB もfalseです。私は書く̸ Bその場合に。abbaa⋚̸b
  2. inf(xi)yyxinO(n)
  3. 半順序の線形拡張を定義できます。アルゴリズムがそのように機能するため、優先キューに使用するのは簡単な方法です。ただし、順序はパフォーマンスに影響し、挿入の順序は最悪の場合を回避するのに最適であるように見えます。

さらに、これで使用したいアルゴリズムは、キュー内のすべての優先順位の下限を知る必要があります。

優先順位には実際の意味がありますが、変更される可能性があるため、他のプロパティに依存することは現実的ではありません。


注:バイナリヒープは半順序では機能しません。ab、およびcのバイナリヒープを想定しますc。ここでacおよびa⋚̸bおよびa⋚̸cです。それらはこの順序で配置されているため、

     a (0)
   /   \
 b (1)   c (2)

ここでdが挿入されます。次の空き位置は3で、bの左の子なbので、次のようになります

        a (0)
      /   \
    b (1)   c (2)
  /
d (3)

場合は(暗示た推移から、しかし、については何も言うことはありませんと)と、そしてと交換されませんそれはあまりありませんので、。しかし、実際には未満です、それと比較されていないため、現在、主要なヒープ不変式は保持されていません。topは最小限ではありません。dadcdbd⋚̸bdba

私は、二項式ヒープのスタイルのヒープの森が機能する可能性があると考えています。基本的に、新しい値をルートと常に比較し、比較可能な要素のみをリンクすることが重要です。これにより、フォレスト内のツリーのサイズがランダムになり、ヒープ内の相互に比較できないセットの数に応じて複雑さが決まります。複雑さは修正できないと思われます(比較可能な要素に到達するまで比較を続けなければなりません)何かを見落としているかもしれないので、私はこれを開いたままにします。


注:順序は部分的であり、線形拡張を定義する方法はありますが、タイムスタンプを追加して二次基準として使用することはそれらの1つではありません。各タイムスタンプを割り当て、または(および場合、順序をとして定義しとします。その後、我々は明確な持っていると仮定し、、、その結果と。次にし、t(a)aababbat(a)t(b)abct(a)t(b)t(c)caabbcであるが、であるため、関係は推移的ではないため、順序付けはまったくありません。この種の拡張は弱い順序でのみ機能し、部分的な順序では機能しません。ca


編集:私は、定義されたセットの無限であるだけでなく、実際にキュー内の現在の要素を効率的に取得できる必要があることに気付きました。そこで、サブツリーの無限大を含む特別なノードを一般的なヒープ構造に追加することが役立つかどうかを検討しています。


インデックス付き優先度キューを検討しましたか?

@hulkmeister:キューにインデックスを付けると、半順序で機能するようになります(いいえ、プレーンバイナリヒープは半順序では機能しません)。

1
私の考えでは、2つのアイテムが比較できない場合、インデックスを使用して挿入の順序を追跡できます。そのため、インデックスを使用して優先度を構成すると、優先度が異なる場合でも同等の一意のキーが得られます。これがあなたの望むように聞こえるなら、私はそれを完全な答えにすることができます。

1
@hulkmeister:まあ、問題はそれよりもはるかに深いです。新しいアイテムが挿入されると、優先度キューは通常、それを何らかの要素と比較します。しかし、それらが比較できない場合、それを挿入する場所がわかりません。インデックスが変更され、おそらく優先順位と一貫性のある完全な順序付けをおそらく与えないため、インデックスの曖昧性解消は機能しません。

この複合型の例と、それが比較できない場合を教えてください。これらの「比較できない」値を等しいと考えることは可能ですか?その場合、挿入順に同じノードに保存できます。

回答:


3

元の質問で提起された正確な問題は難しいように見えますが(その問題の解決策、特にインフィマ発見部分に興味があります)。部分的に順序付けられたセットが実際に製品順序を使用するベクトルで構成されており、優先順位キューが部分的な順序と「互換性のある」順序で値を返すことを保証するだけで十分な場合、つまり、小さな要素は常に大きな要素の前に返されます)、それを行うにはかなり簡単な方法があります。

基本的には、部分的に順序付けられたセットのトポロジカルな順序付けを見つけることです。つまり、ような合計順序 ' ' 。製品注文を使用するベクトルの場合、これは非常に簡単です。単に辞書順 ' 'を使用します。最初の「コンポーネント」は製品注文に使用されるすべてのコンポーネントの合計です(残りのコンポーネントは基本的に任意です。弱い順序に固執することもできます)。我々は、その確認でき および TabaTbS

a<bi(aibi) and i(ai<bi)(iai)<(ibi)aSb
a=bi(ai=bi)(iai)=(ibi)aSb,
、したがっておよびその。したがって、優先順位キューでこの順序を使用し、大きな要素の前に小さな要素(製品の順序)が常に抽出されるようにすることができます。abaSb

さらに多くのオプションがあります。少なくとも1つのコンポーネント、最小、最大、非負の係数を持つ線形結合のいずれかを使用します。拡張機能の選択は、オーバーレイアルゴリズムの速度に影響します。
ジャン・ヒューデック

2

部分注文を完了させることの何が問題になっていますか?

しかし、注文を勝手に完了するのではなく、キューが安定している場合、最小要素が複数ある場合は最も古いものを最初に返す必要があるという意味でキューが安定していることを好みます。

「最も古いもの」を希望する場合、注文は事実上完了しています。「比較できない」アイテムは年齢によって比較可能です。

タイムスタンプ(または他の単調に増加する整数)を各アイテムに追加し、「実際の」比較が不可能な場合に使用します。


3
半順序の線形拡張を行うことができれば、それは素晴らしいことです。しかし、そうではありません。abcの順に挿入され、c≤a かつbがどちらとも比較できないような3つの異なる値があるとします。タイムスタンプを持つ拡張子はa≤ 'bおよびb≤' cを埋めるので、推移性からac未満になりますが、実際の順序と矛盾します。

おそらく、あなたはそれを弱い順序付けと混同したでしょう。弱い順序付けでは、比較できない要素が等価クラスを形成するため、任意の追加基準を追加できます。半順序ではできません。

1

編集:これは興味深い問題のようで、私はそれについて少し研究しました。以下を読むことをお勧めします。

  1. ダレル・レイモンド。半順序データベース、博士論文、ウォータールー大学。

この論文を読むことをお勧めします:Daskalakis、Constantinos、et al。「ポゼットでの分類と選択。」SIAM Journal on Computing 40.3(2011):597-622。

著者は、ここで、ポゼットとチェーンへのポゼットのチェーン分解を受け入れるChainMergeと呼ばれるデータ構造を提示します。データ構造のサイズはです。著者は、で実行される最小値を見つけるためのアルゴリズムを提示します。ここで、はポセットの幅の上限です。..これは面白いと思いました。qO(nq)O(wn)w

注:以前の素朴な答えを削除しました。編集をクリックして表示してください。


0

私の用語の使い方は間違っているかもしれません。見つかった問題を修正するには、回答を直接編集してください。


まず、相互に比較できないセットを入力から検出する必要があります。

たとえば、5つのオブジェクトが存在する場合がありますa, b, c, d, eが、それらの半順序は2つの切断されたグラフを形成します。

  • a ≤ b ≤ c
  • d ≤ e
  • ただし、のいずれかはのいずれとも{a, b, c}比較できません{d, e}

オブジェクトを適切なデータ構造に格納する前に、これらの相互に比較できないセットを最初に検出する必要があります。これは、ユニオン検索アルゴリズムで実行できます


効率のために、新しいオブジェクトの挿入には、「この新しいオブジェクトに匹敵する既存のオブジェクトのリスト」を見つける効率的な方法が必要です。


ここで、各サブセット内({a, b, c}および{d, e})で、最小値を明確に定義する必要があります。(部分的な順序のため、各サブセットには1つ以上の最小値があります。)

私はこれを有向非巡回グラフと見なしています。それをヒープに収めようとすることは悲惨なようです。


この複合データ構造から最小値を抽出するには、次のステップは、すべてのサブセットからすべての最小値のリストを取得し、最も早いタイムスタンプを持つものを選択し、このオブジェクトを削除して返します。


残念ながら、比較可能なオブジェクトのリストを効率的に見つける方法がわかりません。

部分的に順序付けられたセットは、実際、有向非巡回グラフとして見ることができます。ただし、隣接リストではなく、隣接テーブル(実際には関数)で指定されたもの。隣接リストで指定されたポゼットの最小値を見つけるのは簡単ですが、隣接テーブルでは問題になります。

最小値も元のセットで明確に定義されています。接続されたコンポーネントを見つけることは、完全なグラフではないため、どのように役立つかわかりません。

1
ハッセ図は単項ツリー(パスグラフ)の森であると仮定しているように見えますが、質問は既にそれが製品次数であるため、多次元格子であると述べています。
ピーターテイラー

0

私が取り組んでいるプロジェクトには、同様の問題が含まれています(偶然にも、ベクトルの半順序を使用しています)。ランダムに順序付けられたリストを並べ替えるための2次時間アルゴリズムは既にあり、1つのオブジェクトのみが故障した場合の動作を観察することにより挿入アルゴリズムを開発しました。これが可能な限り高速な実装であるかどうかはわかりません。

ここにいくつかの擬似コードがあります。

class PartialOrderPriorityQueue
   q <- empty list
   method insert (n):
     for i <- 0 to (q.length - 1):
       if q[i] <= n:
         t <- q[i]
         q[i] <- n
         n <- t
     q.append(n)

   method pop():
     return q.remove(0)

-1

通常のヒープの動作は、新しい値を後ろに追加し、親よりも大きいと比較しながらふるいにかけることです。

親と子が同じ場合を返す比較を書く場合、親は子よりも大きいため、シフトアップは正しいポイントで終了するはずです。

それはあなたの目的にとって十分に安定した注文としてカウントされますか?


明確にするために、コメントから例を挙げます:a> b、およびcaまたはbと比較できません:

  • a then b then c => a、b、c ...これはすでにヒープ順であり、シフトアップで移動するものはありません
  • b、a、c => a、b、c ... aは正しい場所までふるいにかけられ、再び正しいヒープ順になります。
  • a、c、b => a、c、b ... bはcと比較できないため、ふるいにかけることはできませんが、これはあなたが尋ねたようにFIFOの順序のままにします
  • c、b、a => c、a、b ... aおよびbは正しい相対順序ですが、どちらもcと比較できないため、どちらもcより先に進むことはできません

したがって、結果は挿入の順序に依存します-これはあなたが求めるものと一致するようですが、私はそれが本当にあなたが望むものかどうかわかりません。そうでない場合は、見たい結果を表示できますか?


それでは、コメント(および質問の編集)から、「比較可能な」要素に「比較できない」要素を飛ばし、順序がある場合はその順序で正しい場所を見つけたいと思うでしょう。どう解釈したらいいかわからなかったので、これについて尋ねました

一部の要素が比較できない場合、挿入された順序でそれらを返します

(dとbは編集においてペアワイズでは比較できませんが、挿入された順序でそれらを望んでいません)。

次の質問は、「比較可能な」要素と「比較不可能な」要素の関係についてでしたが、それらは製品順のベクトルであることが明らかになりました(一部の要素がペアワイズであるかどうかは明らかではありませんでしたが、NaNなどのすべてのものと比較することはできません。

したがって、新しい例を使用してベクトル値を割り当てた場合、これはbが他の何かと比較できない例であることは正しいですか?

        a (1,1)
      /      \
    b (0,4)   c (3,3)
  /
d (2,2)

そして、これにソートする必要があります:

        a (1,1)
      /      \
    d (2,2)   c (3,3)
  /
b (0,4)


私は反例があると思ったので、それが機能しないことを質問で明示的に言及しましたが、今はあまり確信がありません。そのようなキューが適切であることを証明できますか(deletemin、挿入、更新も)?そして、それがいる可能性がありますことを、覚えて≤Bが、cは比較することはできません(したがって、上記のルールと「等しい」を比較します)それらのいずれかへ。

まあ、それはまだ証拠ではありません。(より多くの)一般的な慣例とアルゴリズムの実際の必要性である:順序はまだと、ヒープは常にノートが(一番上に最小限の要素を持っていることを証明するために気にしない最小限の場合はそう、上部にA> BBが最初に来ます)。

実際、反例があると思います。仮定し、BCは、ヒープにあり≤B≤C 、トップで、bは子供を残している、cが右の子です。今、Dはその来るD≤Cとし、比類のないとBをbの子として挿入され、それ以上ではなくそこに留まります。今来る電子であるC≤E (これも≤E )とする無類bが。だから、eはの右の子としてで行くBそしてとどまる。次に、aを抽出します(OK、aは最小です)。eはその場所でスワップされ、ふるいにかけられます。これはbとは比べものになりませんが、cよりも小さいため、cと交換します。今エキスCWRONGD≤C

前のコメント(推移性のために保持しなければならない不平等の形を持たなければならない)でミスを見つけた場合、まだチャンスがあります。そうしないと機能しません。

1
わかりました、より簡単な反例。abおよびcがヒープ内にあり、a≤cでありbがいずれとも比較できないと仮定します。aは上、bは左の子、cは右の子です。dは、d≤a(したがってd≤c)であり、bとは比べられないようになります。次の空きスロットはbdの左の子であり、比較できないため、そこにとどまります。さて抽出し、WRONGD≤。なおか≤C関係なく、状況が同じである場合、それらは比類のないです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.