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


14

그래프 문제를 해결하려고합니다 (숙제가 아니라 기술을 연습하는 것입니다). DAG G(V,E) 가 주어지며, 여기서 V 는 꼭짓점 세트이고 E 는 모서리입니다. 그래서 그래프는 인접성리스트로 표현 V는 모두 연결 포함하는 세트이다 브이 . 내 임무는 각 정점 v ∈ V 에서 도달 할 수있는 정점을 찾는 것입니다 . 내가 사용하는 솔루션은 O ( V 3 ) 의 복잡성을 가지고 있습니다. Avvv∈VO(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)nm∈O(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.