時間前処理による時間でのツリーの到達可能性クエリ


7

通常のグラフ理論的な意味で無向木が与えられます。頂点所与及びエッジに入射、Iは、フォームのクエリに答える必要があるリターンを任意の葉から到達可能であるを含む経路でおよびno他のエッジに入射しますより非公式には、制限は、エッジが指定された場合、その方向にのみ進むことができるということです。Tv(v,u)vTv(u,v)v

DFSを実行して、見つかったリーフを返すだけです。これには時間かかると思いますはの直径です。ただし、クエリは時間で回答したいと思います。さらに、線形前処理時間のみを許可したいと思います。これを実現するための私のアイデアは、DFSを使用し、葉にラベルを付け、検索が逆戻りしたときにエッジにラベルを付けることでした。このアイデアは追加の努力でうまくいくかもしれませんが、詳細については本当にわかりません。O(d)dTO(1)

「グラフ到達可能性」はいくつかの結果を出しましたが、おそらくより複雑な問題を扱っています。前処理時間を使用し、時間でクエリに応答する方法に満足しています。O(n+m)O(1)


これは宿題の質問ですか、それとも、これらの限界が必要なアプリケーションがありますか?私の直感は不可能だと言っていますが、宿題として尋ねられたら、おそらく解決策が存在します。
jmite 2013

他に何もない場合、クエリを取得するには、各ノードとエッジのペアのエントリを持つテーブルが必要になるため、前処理には時間かかる可能性が高いと思います。(これは、後で値をすばやく入力できる場合でも、テーブルをすべてTrueまたはすべてFalseに初期化することから生じる場合があります)。DFSのアイデアについて詳しく教えてください。葉や縁にラベルを付けるために何を使用していますか?O(mn)O(1)
jmite 2013

1
@jmite エッジはノードに入射するため、ノードとエッジのペアがあります。2m
Yuval Filmus 2013

@ user9214あなたのアイデアはうまくいくはずです。おそらく「最後に見つかった葉」を覚えており、これを使用してバックトラックするときにノードにラベルを付け、前方エッジと後方エッジを別々に扱う必要があります。試してみて、どのように進んだかをお知らせください。
Yuval Filmus 2013

回答:


5

はい、これは時間で実行できると思います。以下にその方法を概説します。おそらくもっと簡単な方法がありますが、次の方法で十分です。O(1)

前処理。私たちはあなたのツリーをいくつかのルートを持つルート化されたツリーとして見ることができると仮定します。前処理では、各内部ノード、子孫であるリーフの一例を注釈として付けます。これは、非常に単純なトップダウントラバーサル(DFS)を使用して、前処理時間で実行できます。wwO(n+m)

また、を次のように再帰的に定義しますに兄弟がある場合、 ; それ以外の場合、ここで、はの親です。そして、ここではの根です。英語では、は、から始まり、2つ以上の子(またはルート)を持つノードに到達するまで上向きに続くノードとして定義されます。前処理では、各ノードのの値を計算し、それをに関連付けて保存します。これもで計算することができますp()wp(w)=wp(w)=p(v)vwp(r)=rrTp(w)wp(w)wwO(n+m)時間。

クエリに答える。さて、ここでクエリに答えるためにどのようにだから到達可能な任意の葉を返すを含むパスを持つに、無他のエッジの事件をv(u,v)v

  • ケース1:が子であるます。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuO(1)u

  • ケース2:がの親であり、に少なくとも1つの他の子があるとします。次に、他の子を見て、それをと呼びます。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuuwwO(1)w

  • ケース3:がの親であり、には他の子がないとします。次に、とし、(祖先ではなく)他の子にします。次に、クエリに応答すると、子孫である葉が返されます。これは、の注釈を使用して時間で実行できます。uvuu=p(u)wuvwO(1)w

3つのケースすべてで、クエリへの回答は時間で計算できます。O(1)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.