방향성 비순환 그래프의 전이 폐쇄를 검색하기위한 효율적인 알고리즘


14

그래프 문제를 해결하려고합니다 (숙제가 아니라 기술을 연습하는 것입니다). DAG G(V,E) 가 주어지며, 여기서 V 는 꼭짓점 세트이고 E 는 모서리입니다. 그래서 그래프는 인접성리스트로 표현 V는 모두 연결 포함하는 세트이다 브이 . 내 임무는 각 정점 v V 에서 도달 할 수있는 정점을 찾는 것입니다 . 내가 사용하는 솔루션은 O ( V 3 ) 의 복잡성을 가지고 있습니다. AvvvVO(V3), 전이 폐쇄와 함께,하지만 블로그에서 방법을 밝히지 않았지만 더 빠를 수 있다는 것을 읽었습니다. 누구든지 DAG에서 전이 폐쇄 문제를 해결하는 다른 방법을 더 복잡하게 말할 수 있습니까?



그리고 이것은 : cs.hut.fi/~enu/thesis.html
AJed

그러나 를 유지하는 것이 좋습니다 . 그러나 평균적으로 비교 횟수를 줄이십시오. 즉, 추측하고 알고리즘에 간단한 규칙을 추가하십시오. 행렬 곱셈을 사용할 수 있지만 작은 그래프에 사용하는 경우 혼란스럽고 실제로는 방법이 더 좋습니다. O(|V|3)
AJed December

@AJed이 특정 문제에서 는 시간 제한을 초과합니다. O(V3)
Rontogiannis Aristofanis

2
@RondogiannisAristophanes 시간 제한을 말할 때 이것이 topcoder 등과 같은 일부 프로그래밍 / 알고리즘 문제에서 문제라는 것을 의미합니까? 그렇다면 솔루션 을 올바르게 구현했다고 확신 하면 문제를 다시 살펴볼 수 있습니다. 사물을 단순화 할 수있는 다른 숨겨진 속성이 있거나 문제를 표현하는 더 좋은 방법이있을 수 있으므로 전 이적 폐쇄가 필요하지 않습니다. 전이 폐쇄는 행렬 곱셈만큼 어렵 기 때문입니다. student.cs.uwaterloo.ca/~cs466/Old_courses/F08/…를 읽으십시오 O(V3)
Paresh

답변:


8

그래프가 비 주기적이라는 사실은이 문제를 훨씬 간단하게 만듭니다.

토폴로지 종류의 우리에게 정점의 순서를 줄 수는 등,이 경우 내가 < j는 , 그때부터 더 에지가없는 V의 J에 다시 V . 모든 모서리가 목록에서 "앞으로"이동할 수 있도록 정점을 나열했습니다.v1,v2,,vni<jvjvi

(분석을 수정하고 약간 더 빠른 알고리즘을 제공하도록 편집 됨)

이제 마지막 정점 에서 시작하여이리스트를 거꾸로 돌아갑니다 . v n 의 전이 폐쇄는 그 자체입니다. 또한 추가 브이 N을 행 에지와 각 정점의 전이 폐쇄 V N .vnvnvnvn

서로 버텍스를 들어 최종 뒤쪽에서가는 첫번째 추가 V 나는 자신의 이적 폐쇄, 다음의 전이 폐쇄에 모든 것을 추가 V 에 가장자리 정점 모두의 전이 폐쇄 V .vivivivi

최악의 경우 실행 시간은 이며, n 은 꼭짓점 수이고 m O ( n 2 ) 는 가장자리 수입니다. 위상 정렬에는 시간 O ( n + m ) 가 걸립니다 . 그런 다음 우리는 역방향 패스에서 또 다른 O ( m n ) 작업을 수행합니다. 우리는 목록을 거꾸로 가면서 각 모서리에 대해 최대 n 을 더해야합니다.O(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n 누군가의 전이 폐쇄에 대한 정점.

비트 배열로 모든 사람의 전 이적 클로저를 나타내면 상수가 빠르게 향상 될 수 있습니다. 만 가지고 있다고 가정하십시오 . 당신은 비트 단일 64 비트 INT 사용하는 것이 내가 경우 1 내가 그렇지 않으면 내 전이 폐쇄 및 0입니다. 그러면 i 의 전이 클로저에있는 모든 것을 j 에 추가하는 부분 이 정말 빠릅니다. c j | = c i 만 취 합니다. (이진 OR 연산)n=64iiijcjci

들어 , 당신은 배열에 보관하고 약간의 계산을해야 할 것이다, 그러나 그것은 훨씬 더 빨리 객체 세트보다 것이다.n>64

Also, I know the big-O in the very worst case is still O(n3), but to beat this in practice you'd have to have something much more complex. This algorithm also does very well on sparse graphs.


1
You could likely use a linked list representation for the sets and they would end up sharing common tails.
Kyle Butt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.