в grpah какой будет самый быстрый способ найти все узлы, подключенные к одному узлу, но не подключенные к другому узлу.?

#algorithm #data-structures #graph

#алгоритм #структуры данных #График

Вопрос:

Допустим, у вас есть два узла P и Q. Теперь нам нужно найти узлы, имеющие ребро с Q, но не с P. Какой самый быстрый способ сделать это? Какой алгоритм или структуру данных я должен использовать? В настоящее время при добавлении ребра я поддерживаю вектор с каждым узлом, который сохраняет все узлы, подключенные к этому узлу (давайте назовем это Vi для i-го узла). Также у меня есть матрица смежности. Примерно что-то вроде этого я делаю.


for each node in Vq
check if it is connected to P using adjacency matrix
do something with this node

Как вы думаете, здесь можно сделать что-нибудь быстрее?

Ответ №1:

Почти то же самое:

  • Возьмите строку P и строку Q из матрицы смежности
  • Для узла I,
    • если I-й столбец имеет 0 в строке P и 1 в строке Q, выполните операцию.

Это явно указывает на отсутствие другого цикла внутри цикла for для «проверки, подключен ли он».

Это самое быстрое, что вы можете сделать теоретически (это O (n), а теоретическая нижняя граница равна O (n)). На практике вы могли бы оптимизировать его в зависимости от того, какой язык вы используете и для чего он оптимизирован. Например, Matlab понравилось бы, если бы вы сформулировали это как:

 nodes = (~rowP)*rowQ';
  

Комментарии:

1. Я также думал о подобных линиях.

Ответ №2:

Поправьте меня, если я ошибаюсь, но он должен выполняться не быстрее линейного времени. Каждый узел должен быть проверен, но существование ребра проверяется за постоянное время.