Ефективний алгоритм отримання транзитивного закриття спрямованого ациклічного графіка


14

Я намагаюся вирішити задачу з графіком (це не для домашніх завдань, просто для того, щоб практикувати свої навички). Дано DAG , де V - множина вершин, а E - ребра. Графік представлений у вигляді списку суміжності, тому A v - це набір, що містить усі з'єднання v . Моє завдання полягає в тому, щоб знайти , які вершини досяжні з кожної вершини про V . Я використовую розчин має складність O ( V 3 )G(V,E)VEAvvvVO(V3), з транзитивним закриттям, але я читав, що в блозі це може бути швидше, хоча він не виявив, як. Може хтось скаже мені інший спосіб (з кращою складністю) вирішити проблему перехідного закриття в DAG?




Однак моя пропозиція - зберегти . але просто спробуйте зменшити кількість порівнянь у середньому. Тобто робіть здогадки та додайте до свого алгоритму прості правила. Ви можете використовувати матричне множення - але якщо ви використовуєте його для невеликих графіків - то це просто безлад, і на ділі ваш метод є кращим. O(|V|3)
AJed

@AJed У цій конкретній проблемі перевищить межу часу. O(V3)
Ронтогіаніс Арістофаніс

2
@RondogiannisAristophanes Коли ви говорите про обмеження часу, ви маєте на увазі, що це проблема в деяких завданнях програмування / алгоритму, таких як topcoder тощо? Якщо так, і якщо ви впевнені, що правильно виконали O(V3) , ви можете переглянути проблему ще раз. Може бути якась інша прихована властивість, яка може спростити речі, або може бути кращий спосіб висловити проблему, щоб не потрібне перехідне закриття. Тому що транзитивне закриття таке ж важке, як і множення матриці. Читайте student.cs.uwaterloo.ca/~cs466/Old_courses/F08/…
Paresh

Відповіді:


8

Той факт, що наш графік є ациклічним, робить цю проблему набагато простішою.

Топологічний сорт може дати нам упорядкування вершин таким, що, якщо i < j , то немає ребра від v j назад до v i . Ми перерахували вершини такими, що всі ребра в нашому списку йдуть "вперед".v1,v2,,vni<jvjvi

(відредаговано, щоб виправити аналіз та дати трохи швидший алгоритм)

vnvnvnvn

vivivivi

O(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n вершини на чиєсь перехідне закриття.

n=64iiijcjci

Для n>64

OO(n3)


1
Ви, ймовірно, можете використовувати пов'язане представлення списку для наборів, і вони в кінцевому підсумку поділять загальні хвости.
Кайл Батт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.