グラフ内のツイン頂点を見つける


22

ましょうグラフです。頂点のX V、定義N Xのの(オープン)近傍であることがXG。、であるN X = { Y VG=(V,E)xVN(x)xGu vが同じ近隣ノードを持つ場合、つまり N u = N v )の場合、 Gの 2つの頂点 u v双子に定義します。N(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

入力としてn個の頂点とm個のエッジに関するグラフ与えられた場合、そのようなペアが存在する場合、Gで双子のペアをどれだけ速く見つけることができますかGnmG

近傍を比較することにより、与えられた2つの頂点が時間に双子であるかどうかを確認できます。簡単なアルゴリズムは、双子を見つけることです。したがって、頂点のペアごとに、双子かどうかを確認します。これにはO n 3時間かかりますまた、すべての双子のペアを検出します)。グラフ内に双子のペアを見つける(存在する場合)ための非常に高速な方法はありますか?この問題に対処する既知の研究はありますか?O(n)O(n3)


近隣を反復処理して、ハッシュテーブルに追加できます。関連:cstheory.stackexchange.com/q/3390/236
ラドゥグリゴール

1
これは、ここでの演習2.17であるbooks.google.co.uk/...
ラドゥグリゴール

編集権限を持つ人は、双子の定義を修正する必要があります。(TheMachineCharmerの答えに関するコメント、または私がリンクした本の定義を参照してください。)
ラドゥグリゴール

回答:


21

グラフ内の双子はサイズ2の単なるモジュールです。グラフのモジュラー分解は時間で見つけることができます。モジュラー分解ツリーは暗黙的にグラフのすべてのモジュールを表し、3つのタイプの内部ノードで構成されます:直列、並列、および素数ノード、リーフは個々のノードで構成されます。少なくとも2つの頂点の集合S Vがあればモジュールであり、それは、ツリー内のいくつかのノードまたは一連の子供のいくつかのセットまたは並列ノードの和集合である場合にのみ。O(n+m)SV

双子ノードのペアを見つけるために、存在する場合、時間でモジュラー分解ツリーを構築できます。次に、リーフを見てください。リーフの親が直列または並列ノードである場合、そのノードには、ツインペアを形成する少なくとも2つの子が必要です。したがって、合計実行時間は線形です。O(n+m)

http://en.wikipedia.org/wiki/Modular_decomposition


モジュラー分解を紹介してくれてありがとう!
gphilip

12

問題は、グラフマトリックスに2つの等しい行があるかどうかを判断することと同じです。グラフ行列の行にトライを構築できます。時間の完全性はO(n ^ 2)になります


6
隣接リストの同じ考えはを与えます。O(m+n)
ラドゥグリゴール

今私はハエをnukingしています;)
シェンチーチャン張顯之

2
これは多少一般化できます。我々は問題言い換えるならば、 "与えられた(ここで、F X = N Xが)の別個見つけるX 1はxは2ように、F X 1= F X 2 "、次いで全順序のためにYを一つのアプローチは、評価することであるF X それぞれについてのx Xをf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX、並べ替え、並べ替えられたリストで重複を確認します。トライは事実上基数ソートです。
ピーターテイラー

8

編集:@MikleBと@Travisによるソリューションは非常に巧妙です。過剰な回答で申し訳ありません。


乗算をEQU(つまりNXOR)で置き換え、加算をANDで置き換えることにより、問題をグラフの隣接行列行列乗算問題に還元できるようです。そのため、グラフに双子のペアがある場合、結果のマトリックスA A Tは恒等行列ではなくa i jがゼロでないインデックスi j はまさに双子ペアノードです。AAAT(i,j)ai,j

私の知る限り行列乗算問題はで解決することができますとの時間α 2.376銅細工・ウィノグラードアルゴリズム。実用的なソリューションが必要な場合、行列乗算アルゴリズムは実際にうまく機能します。O(nα)α2.376


素晴らしいこれが動作します!:DIは、上半分のみを評価するだけで十分だと思います。どう思いますか?A2
プラティックデオガレ

1
@TheMachineCharmer:ありがとう:)はい、グラフが無向の場合。
Hsien-Chih Chang張顯之

はい。まさに!:)
プラティックデオガレ

5

このサイトのクレイジーなシステムのために、私は直接コメントすることはできませんが、既存の回答についていくつかの意見があります。

Hsien-Chih Changのソリューションでは、A A Tに修正する必要があると確信しています。A2AAT

TheMachineCharmerの観測4は前から後ろに向かっています(反例:[0,0,1]、[0,1,0]、[0,1,1]には行列式0がありますが双子はありません)。双子が存在する場合、行列式はゼロです。


問題はありません。例はありますか?ところで、このサイトのシステムはクレイジーではありません!:)A2
プラティックデオガレ

は、無向グラフ( A == A T)では機能しますが、一般に有向グラフでは機能しません。XNOR上のANDは、Aの2つの行を比較する必要があり、行列の乗算は、最初の行列の行と2番目の行列の列で実行されます。A2AAT
ピーターテイラー

システムはクレイジーではないかもしれませんが、初めてのポスターには直観に反するかもしれません。答えることはできますが、コメントすることはできません...しかし、あなたのコメントは投稿を正当化するのに十分な見栄えでした。あなたがより多くの評判を築いたら、私はあなたがシステムがかなり中毒性があると思うと思います。
ハードマス

3
答えることはできるがコメントできないのおかしい。新しいユーザーは、役に立たないか間違った場所で答えるかを選択する必要があります。
ピーターテイラー

3

このスレッドはかなり古いです。しかし、誰も最もエレガントでシンプルなアプローチにぶつかったようには見えません。O(n + m)時間で隣接リストを辞書式にソートしてから、重複をチェックします(Aho、Hopcroft、Ullman、74 'を参照)。モジュラー分解を使用できますが、これは完全に過剰です。


2

このスレッドは古く、OPの質問には回答しましたが、線形ペアでそのようなペアをすべて見つけるために別のアルゴリズムを追加したいと思います。パーティションの改良については誰も言及していません!

このアルゴリズムは、偽双子の等価クラスを見つけます。このアルゴリズムは、パーティションを洗練する効率的な手順に依存しています。セットSとパーティションを指定しP = {X1, ..., Xn}ます。refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}^交差点の-設定と差異の設定を示します。パーティションは、さらに洗練されない場合、安定しています。この手順にはO(| S |)時間がかかります(パーティションの改良に関するWikipediaの記事を参照)ので、高速です。

Algorithm:

P = {V} // initial partition consists of the vertex set
for every vertex v:
    P = refine(P, N(v)) // refine with the open neighborhood of v

合計時間はO(| V | + | E |)です。これも簡単にプログラムできます。


1

役に立つかもしれないいくつかの観察

  1. a,bVabcdcN(a)dN(b)

  2. |N(a)||N(b)|ab

  3. bN(a)ab

  4. 双子が存在する場合、隣接行列の行列式はゼロです。

派手なアイデア:

  1. height = | V |で完全なバイナリツリーを構築します。
  2. 次に、隣接行列の1行の読み取りを開始します。
  3. 0に遭遇した場合は左に進み、そうでない場合は右に進みます。
  4. リーフに到達したら、頂点をそこに保存します。
  5. これをすべての行に対して行います。そのため、最終的に各リーフには隣接があります。

Inspired by Huffman圧縮アルゴリズムから盗まれました!:)


2
ab

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