그래프에서 쌍 꼭짓점 찾기


22

를 그래프로 하자 . 꼭짓점 x V의 경우 N ( x )G 에서 x 의 (공개) 이웃이되도록 정의 하십시오 . 즉, N ( x ) = { y VG=(V,E)xVN(x)xG . 두 정점을 정의, V 에서 G가 되도록쌍둥이경우 U V 인 이웃들의 동일한 세트를 가지고 있다면 N ( U ) = N ( V ) .N(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

그래프 감안할 때 n 개의 정점과 m의 입력으로 가장자리, 얼마나 빨리 우리의 쌍둥이 한 쌍 찾을 수 있습니다 G를 같은 한 쌍있는 경우는?GnmG

우리는 주어진 두 정점이 인접 시간을 비교하여 시간에 쌍둥이인지 여부를 확인할 수 있습니다 . 쌍둥이를 찾는 간단한 알고리즘은 따라서 각 쌍의 꼭짓점에 대해 쌍둥이인지 확인하는 것입니다. 이것은 O ( n 3 ) 시간 이 걸린다 ( 또한 모든 쌍의 쌍둥이를 찾는다 ). 그래프에서 한 쌍의 쌍둥이를 찾을 수있는 훨씬 빠른 방법이 있습니까? 이 문제를 다루는 문헌에 알려진 연구가 있습니까?O(n)O(n3)


이웃을 통해 반복하여 해시 테이블에 추가 할 수 있습니다. 관련 : cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
이것은 연습 2.17입니다 books.google.co.uk/…
Radu GRIGore

편집 권한이있는 사람은 쌍둥이의 정의를 수정해야합니다. (TheMachineCharmer의 답변에 대한 의견 또는 내가 링크 한 책의 정의를 참조하십시오.)
Radu GRIGore

답변:


21

그래프의 트윈은 크기가 2 인 모듈입니다. 그래프의 모듈 식 분해는 시간 에서 찾을 수 있습니다 . 모듈 형 분해 트리는 그래프의 모든 모듈을 암시 적으로 나타내며 직렬, 병렬 및 프라임 노드의 세 가지 유형의 내부 노드로 구성되며 잎은 개별 노드로 구성됩니다. 적어도 두 개의 꼭짓점 S V 의 집합은 트리의 일부 노드이거나 직렬 또는 병렬 노드의 일부 하위 집합의 합집합 인 경우에만 모듈입니다.O(n+m)SV

따라서 한 쌍의 트윈 노드를 찾으려면 시간 에 모듈 형 분해 트리를 구성 할 수 있습니다 . 그런 다음 잎을 살펴보십시오. 잎의 부모가 직렬 또는 병렬 노드 인 경우 해당 노드에는 쌍둥이 쌍을 형성하는 적어도 두 개의 자식이 있어야합니다. 따라서 총 실행 시간은 선형입니다.O(n+m)

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


모듈 식 분해에 대해서도 소개해 주셔서 감사합니다!
gphilip

12

문제는 그래프 행렬에 두 개의 동일한 행이 있는지 확인하는 것과 같습니다. 그래프 행렬의 행에 trie를 구성 할 수 있습니다. 시간 완성은 O (n ^ 2)입니다.


6
인접 목록에 대한 동일한 아이디어는 합니다. O(m+n)
Radu GRIGore

지금 나는 날아 다니고있다;)
Hsien-Chih Chang 張顯 之

2
이것은 다소 일반화 될 수 있습니다. 우리가 문제 환언하면 "주어 (여기에서 F ( X ) : = N ( X가 ) ) 별개의 발견 X 1 , X 2 되도록 F ( X 1 ) = F ( X 2 ) "그 완전히 정렬 된 Y에 대해 한 가지 접근법은 각 x X 에 대해 f ( x ) 를 평가하는 것입니다.f:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX정렬하고 정렬 된 목록에서 중복 항목을 확인하십시오. 트라이는 사실상 기수 정렬입니다.
피터 테일러

8

편집 : @MikleB 및 @Travis의 솔루션은 훨씬 영리합니다. 과도한 답변에 대해 죄송합니다.


곱셈을 EQU (즉, NXOR)로 바꾸고 AND를 더하여 그래프 의 인접 행렬 A 에서 행렬 곱셈 문제로 문제 를 줄일 수있는 것 같습니다 . 따라서 그래프에 쌍 쌍의 쌍이 있으면 결과 행렬 A A T 는 항등 행렬이 아니며 값 a i , j 가 0이 아닌 인덱스 ( i , j ) 는 정확히 쌍 쌍 노드입니다. .AAAT(i,j)ai,j

내 최고의 지식에 대한 행렬 곱셈 문제는 해결 될 수 와 시간 α 2.376 바이 카퍼 - Winograd 알고리즘 . 실용적인 솔루션이 필요한 경우 모든 행렬 곱셈 알고리즘이 실제로 잘 작동합니다.O(nα)α2.376


대단합니다. : DI는 상반부 만 평가하는 것으로 충분하다고 생각합니다 . 어떻게 생각해? A2
Pratik Deoghare

1
@TheMachineCharmer : 감사합니다 :) 그렇습니다.
Hsien-Chih Chang 張顯 之

예. 정확하게! :)
Pratik Deoghare

5

이 사이트의 미친 시스템 때문에 직접 의견을 말할 수는 없지만 기존 답변에 대한 몇 가지 관찰 사항이 있습니다.

A2AAT

MachineCharmer의 관측치 4는 앞뒤로입니다 (카운터 예 : [0,0,1], [0,1,0], [0,1,1]은 결정자 0이지만 쌍둥이는 없습니다). 쌍이 존재하면 행렬식은 0입니다.


A2

A2AAT

시스템은 미친 것이 아니지만 처음 포스터에 반 직관적 일 수 있습니다. 답변을 할 수는 있지만 댓글을 달 수는 없지만 댓글은 게시를 정당화하기에 충분합니다. 더 많은 명성을 쌓으면 시스템이 매우 중독성이 있다고 생각합니다.
hardmath

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. 쌍이 존재하면 인접 행렬의 행렬식은 0입니다.

멋진 아이디어 :

  1. 높이 = | V |로 완전한 이진 트리를 작성하십시오.
  2. 그런 다음 인접 행의 한 행을 읽습니다.
  3. 당신이 0을 발견하면 왼쪽을 가지고 그렇지 않으면 오른쪽을 가져 가라.
  4. 당신이 잎에 도달하면 정점을 저장합니다.
  5. 모든 행에 대해이 작업을 수행하십시오. 따라서 결국 각 잎에는 이웃이 있습니다.

허프만 압축 알고리즘 에서 영감 얻은 도난 ! :)


2
ab

1
N(a)b=N(b)a
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.