Посещение каждого подключенного узла без посещения более одного раза - PullRequest
1 голос
/ 22 августа 2011

А есть множество объектов. Каждый объект содержит список других объектов, с которыми он связан, но не все объекты связаны с любым другим объектом. Я пытаюсь посетить каждый объект, связанный с конкретным начальным объектом. Наиболее очевидный способ сделать это:

  • Поместить каждый объект, связанный с начальной точкой, в очередь
  • Для каждого объекта в очереди:
    • Выполнить любую операцию с этим объектом
    • Добавить этот объект в список посещенных объектов
    • Проверить, если каждый объект, связанный с этим объектом, если в этом списке посещений, если нет, добавить его в очередь

Есть ли лучший способ, который не предполагает хранения списка каждого посещенного объекта?

1 Ответ

2 голосов
/ 22 августа 2011

Учитывая структуру данных, которую вы описываете (любой объект может соединиться с любым другим), я не думаю, что у вас есть выбор, кроме как сохранить уже посещенный список. Если бы ваши объекты были в иерархической древовидной структуре, то для реализации того, что вы хотите, мог бы быть реализован алгоритм рекурсивного обхода дерева.

В вашей структуре одноранговых объектов любой алгоритм, пытающийся покончить с уже посещенным списком, рискует зайти в бесконечные циклы для циклических ссылок. Я полагаю, вы могли бы создать флаг «посещение» в самих объектах, очистив их все перед запуском какого-либо алгоритма, но это кажется более неуклюжим, чем метод списка (и по своей природе менее поточно-ориентированный).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...