Який найефективніший алгоритм та структура даних для підтримки інформації про з'єднані компоненти на динамічному графіку?


9

Скажімо, у мене є непрямий обмежений графік, і мені потрібно мати можливість ефективно виконувати такі запити:

  • ЯсСоннеcтег(N1,N2) - повертає Тякщо є шлях між і , інакшеN1N2Ж
  • СоннеcтегNогес(N) - повертає набір вузлів, до яких можна дістатися зN

Це легко зробити за допомогою попереднього обчислення підключених компонентів графіка. Обидва запити можуть запускатися в час.О(1)

Якщо мені також потрібно мати змогу додавати краї довільно - - я можу зберігати компоненти в структурі даних, що перебувають у розрізненні . Щоразу, коли додається край, якщо він з'єднує два вузли в різних компонентах, я б об'єднав ці компоненти. Це додає витрати на а на і (що також може бути ).АггЕгге(N1,N2)О(1)АггЕггеО(ЯнvеrсеАcкеrманн(|Nогес|))ЯсСоннеcтегСоннеcтегNогесО(1)

Якщо мені також потрібно мати змогу видалити краї довільно, яка найкраща структура даних для вирішення цієї ситуації? Це один відомий? Підводячи підсумок, він повинен ефективно підтримувати такі операції:

  • ЯсСоннеcтег(N1,N2) - повертає , якщо існує шлях між і , в іншому випадку .ТN1N2Ж
  • СоннеcтегNогес(N) - повертає набір вузлів , які доступні з .N
  • АггЕгге(N1,N2) - додає край між двома вузлами. Зауважте, що , або обидва, можливо, раніше не існували.N1N2
  • RемоvеЕгге(N1,N2) - видаляє наявний край між двома вузлами.

(Мене це цікавить з точки зору розвитку ігор - ця проблема, здається, виникає в досить багатьох ситуаціях. Можливо, гравець може побудувати лінії електропередач, і ми повинні знати, чи підключений генератор до будівлі. Можливо, гравець може заблокувати і розблокуємо двері, і нам потрібно знати, чи може ворог дістатись до гравця. Але це дуже загальна проблема, тому я це сформулював як такий)


СоннеcтегNогес не вдалося втекти О(1), тому що якщо він повертає список н вузлів, знадобиться Ω(н)час. РеалізаціяСоннеcтегNогесз BFS є оптимальним, тому потенційна структура даних потребує лише підтримки IsConnected, AddEdge та RemoveEdge. Це здається важливим для вашого запитання: stackoverflow.com/questions/7241151/…
Том ван дер Занден

@TomvanderZanden Повернення вже створеного набору (у програмуванні, покажчику чи посиланні) є О(1)... хоча користувач не так вже й багато СоннеcтегNогес міг би це зробити О(1) і не охоплені ЯсСоннеcтег.
користувач253751

Відповіді:


11

Ця проблема відома як динамічна взаємозв'язок, і вона є активною сферою досліджень у теоретичному співтоваристві з інформатики. Однак деякі важливі проблеми все ще відкриті.

Щоб зрозуміти термінологію, ви вимагаєте повністю динамічного підключення, оскільки ви хочете додати та видалити краї. Є результат Холма, де Ліхтенберга і Торупа (J.ACM 2001), який досягаєО(журнал2н) час оновлення та О(журналн/журналжурналн)час запиту. З мого розуміння, це здається реалізованим. Простіше кажучи, структура даних підтримує ієрархію діючих дерев - і динамічне з'єднання в деревах простіше покрити. Я можу порекомендувати замітки Еріка Д. Демена для гарного пояснення, дивіться тут відео. Примітка Еріка також містить вказівки на інші відповідні результати. Як зауваження: всі ці результати є теоретичними результатами.

Ці структури даних можуть не надавати запити ConnectedNodes як такі, але це легко досягти. Просто підтримуйте в якості додаткової структури даних графік (скажімо, як подвійний список ребер) і виконайте пошук по глибині перших, щоб отримати вузли, до яких можна дістатися з певного вузла.

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