Скажем, у меня есть неориентированный конечный разреженный граф, и мне нужно эффективно выполнять следующие запросы:
- - возвращает если есть путь между и N_2 , в противном случае FН 1 Н 2 F
- - возвращает набор узлов, которые доступны из
Это легко сделать, предварительно вычислив подключенные компоненты графа. Оба запроса могут быть выполнены за раз.
Если мне также нужно иметь возможность добавлять ребра произвольно - - тогда я могу хранить компоненты в структуре данных с несвязным множеством . Всякий раз, когда добавляется ребро, если оно соединяет два узла в разных компонентах, я бы объединял эти компоненты. Это добавляет стоимость стоимости и к и (которые также могут быть ).
Если мне также нужно иметь возможность произвольно удалять ребра, какова лучшая структура данных, чтобы справиться с этой ситуацией? Один известен? Подводя итог, он должен эффективно поддерживать следующие операции:
- - возвращает , если существует путь между и , в противном случае .
- - возвращает набор узлов , которые доступны из .
- - добавляет ребро между двумя узлами. Обратите внимание, что , или оба, возможно, не существовали раньше.
- - удаляет существующее ребро между двумя узлами.
(Я заинтересован в этом с точки зрения разработки игры - эта проблема, по-видимому, возникает в довольно многих ситуациях. Возможно, игрок может построить линии электропередачи, и нам нужно знать, подключен ли генератор к зданию. Возможно, игрок может заблокировать и откройте двери, и нам нужно знать, сможет ли враг добраться до игрока. Но это очень общая проблема, поэтому я сформулировал это так)
источник
Ответы:
Эта проблема известна как динамическая связь, и она является активной областью исследований в сообществе теоретических компьютерных наук. Все еще некоторые важные проблемы все еще открыты здесь.
Чтобы прояснить терминологию, вы запрашиваете полностью динамическое соединение, так как хотите добавлять и удалять ребра. Есть результат Хольма, де Лихтенберга и Торупа (J.ACM 2001), который достигает времени обновления и времени запроса . Из моего понимания это кажется осуществимым. Проще говоря, структура данных поддерживает иерархию связующих деревьев, а динамическое связывание в деревьях легче охватить. Я могу порекомендовать заметки Эрика Д. Демейна для хорошего объяснения, смотрите здесь видео. Записка Эрика также содержит указатели на другие соответствующие результаты. Как примечание: все эти результаты являются теоретическими.O(log2n) O(logn/loglogn)
Эти структуры данных могут не предоставлять запросы ConnectedNodes как таковые, но этого легко достичь. Просто поддержите в качестве дополнительной структуры данных график (скажем, как двунаправленный список ребер) и выполните поиск в глубину, чтобы получить узлы, к которым можно обратиться из определенного узла.
источник