지시 된 노동 조합 찾기


11

동적으로 에지를 추가하고 특정 쿼리를 수행 할 수 있는 유 방향 그래프 G 를 고려하십시오 .

예 : 분리 된 포리스트

다음 쿼리 세트를 고려하십시오.

arrow(u, v)
equiv(u, v)
find(u)

첫 번째는 화살표 추가 u→v 경우 그래프, 두번째는 결정 u↔∗v , 마지막 하나의 등가 클래스의 정규 대표 발견 ↔∗ , 즉 r(u) 이되도록 u↔∗v 암시 r(v)=r(u) .

유사 상수 상각 복잡성, 즉 에서 이러한 쿼리를 구현 하는 분리 세트 포리스트 데이터 구조를 사용 하는 잘 알려진 알고리즘 이 있습니다. 이 경우 에는를 사용하여 구현됩니다 .O(α(n))equivfind

더 복잡한 변형

이제 지시 사항이 중요한 더 복잡한 문제에 관심이 있습니다.

arrow(u, v)
confl(u, v)
find(u)

먼저 화살표 추가 노드가 있으면 초침 결정, 도달 양쪽으로부터 및 즉, . 마지막 객체 리턴한다 되도록 의미 여기서 쉽게 계산할 수 있어야한다. (즉,를 계산하기 위해 ). 목표는 이러한 작업이 빠르도록 올바른 데이터 구조를 찾는 것입니다.w u v u → ∗ ← ∗ v r ( u ) u → ∗ ← ∗ v r ( u ) ∙ r ( v ) ∙u→vwuvu→∗←∗vr(u)u→∗←∗vr(u)∙r(v)∙confl

사이클

그래프에는 사이클이 포함될 수 있습니다.

주요 문제에 대한 DAG 만 고려하기 위해 강력하게 연결된 구성 요소 를 효율적 이고 점진적으로 계산 하는 방법이 있는지 모르겠습니다 .

물론 DAG에 대한 솔루션도 감사하겠습니다. 최소 공통 조상의 증분 계산에 해당합니다.

순진한 접근

분리 된 포리스트 데이터 구조는 가장자리 방향을 무시하기 때문에 여기서는 도움이되지 않습니다. 참고 그래프는 합류하지 않은 경우, 하나의 노드가 될 수 없다.r(u)

정의 할 수있는 하나 및 정의하는 등 때 . 그러나 이것을 점진적으로 계산하는 방법은 무엇입니까?∙ S 1 ∙ S 2 S 1 ∩ S 2 ≠ ∅r(u)={v∣u→∗v}∙S1∙S2S1∩S2≠∅

이러한 큰 집합을 계산하는 것이 유용하지 않을 수 있으므로 일반적인 집합 찾기 알고리즘 에서처럼 작은 집합이 더 흥미로워 야합니다.

답변:


3

( 편집 : 문제에 대한 나의 이해가 명확 해 졌으므로 이제 내 대답을 완전히 다시 작성했습니다.)

그래프가 작성되고 검색 될 때 그래프의 전이 폐쇄의 근사를 점진적으로 구성하고 개선하기 위해이 문제를 줄일 수있는 것처럼 들립니다.

u v v ≠ u u , v u v u w v wr(u) 는 추상적으로 그래프의 모든 에 대해 와 모두에서 도달 할 수있는 모든 노드의 집합입니다 . (물론, 모든 쌍이 반드시 두 노드 모두에 도달 할 수있는 노드를 갖는 것은 아닙니다.) union-find의 경우와 달리이 세트는 그래프에서 표준 대표 노드로 표시 될 수 없습니다. 와 모두에서 도달 할 수있는 노드 와 와 모두 에서 도달 할 수있는 노드가있을 수 있지만 와 모두에서 도달 할 수 없습니다 .uvv≠uu,vuvuwvw

당신이 모든에 대한 유지 말 , 노드의 집합에서 연결할 수 (I이 전화 할게 ). 이러한 세트는 각 노드에 대한 추가 데이터 구조이거나 최소한 그래프의 추가 "단축"모서리 세트 일 것입니다. 그래프의 지정된 구조를 유지하는 데 신경 쓰지 않으면 이러한 가장자리와 지정된 가장자리를 구분할 필요가 없습니다.u R ( u )uuR(u)

일반적인 경우보다 더 효율적인 데이터 구조 (예 : 비트 벡터 또는 해시 테이블)를 캡처하는 데이터 구조에 대한 아이디어가 없지만 이 세트를 점진적으로 업데이트 할 수 있습니다 .

당신이에서 우위를 추가 할 때마다 다른 노드로 , 당신은 설정 .v R ( u ) = R ( u ) ∪ R ( v )uvR(u)=R(u)∪R(v)

confl먼저 시도하여 구현하십시오 . 비어 있지 않으면 true를 반환하십시오. 이 경우 그러나 이다 빈에서 두 개의 평행 한 폭 우선 검색을 수행 할 및 당신도 모두 도달 세트를 배출 또는 공통의 노드를 찾을 때까지. 이렇게하는 동안 찾은 도달 가능한 노드를 포함하도록 및 (및 찾은 모든 중간 노드 의 도 업데이트 하십시오. 공통 노드를 찾으면 R (u) = R (v) = R (u) \ cup R (v)로 설정하십시오 .R ( U ) R ( V ) R ( U ) R ( V ) RR(u)∩R(v)R(u)R(v)R(u)R(v)R

find(u) 만 반환합니다 . 문제는 순전히 측면에서 구현되지 않는다는 것입니다 . 알고리즘이 비 증분 적이 지 않으면 어떻게 될 수 있는지 알지 못합니다 (예 : 그래프의 전 이적 폐쇄로 모든 노드의 모든 세트를 사전 계산하십시오 ). 비용이 가까운 지 알 수는 없지만 비용은 들지 않습니다 . (아마하지 않는 거짓 대답을에서. 귀하의 경우 두 BFS'es도 시작해야합니다 세트가 포화된다. 알고리즘은 비 증분을 만들어하지 않는 한이 또한 피할 것)R O ( α ( N ) ) RR(u)conflfindRO(α(n))conflR

이것은 La Poutré와 van Leeuwen의 그래프의 전 이적 폐쇄를 유지 하는 특별한 방법 인 것처럼 들린다 .

나는 이것이 질문에 완전히 대답하지는 않지만 그것을 명확히하는 데 도움이되며 그래프 알고리즘에 대한 경험이 많은 사람은 세트 를 인코딩하기 위해 더 나은 데이터 구조를 제공 할 수 있습니다 .R


답변 해 주셔서 감사합니다. 지금 질문을 더 명확하게 밝히기를 바랍니다. 연결된 구성 요소에 대해서는 신경 쓰지 않지만 CC 는 최종 솔루션에 도움 이 될 수 있습니다. 나는 이없는 이 아직이 DAG의 단일 노드가 될 수 없습니다. r ( u )r(u)r(u)
— jmad

좋습니다. 조금 더 명확합니다. 는 추상적 으로 모든 대해 와 에서 도달 할 수있는 모든 노드의 집합 인 것으로 보입니다.u vr(u)uv 그래프의 v ≠ u 에. 이 세트는 u 의 "바로 가기"모서리 세트 일 수 있습니다. 그러면 그래프에서 도달 가능성의 전 이적 폐쇄를 계산하는 것처럼 보입니다. 나는 여전히 유니온 찾기보다 더 많은 스토리지 / 작업 (모든 "단축"모서리를 레이블 / 업데이트해야 함)을 필요로 할지라도 여전히 이것이 왜 점차적으로 수행 할 수 없었는지를 알지 못합니다 (경로를 압축 경로로). 이게 말이 되요? v≠uu
— Chris Pressey

r(u)

confl(u,v)R(u)R(v)find

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