Поиск по графику глубина-первая
применяет поиск глубины первый к график v
= dfsearch(G
,s
)G
запуск в узле s
. Результатом является вектор идентификаторов узла в порядке их обнаружения.
[___] = dfsearch(___,'Restart',
, где tf
)tf
является true
перезапускает поиск, если новые узлы не доступны из обнаруженных узлов. Можно использовать любой из входа или выходных аргументов, комбинаций в предыдущих синтаксисах. Эта опция гарантирует, что поиск по глубине первым достигает всех узлов и ребер в графике, даже если они недоступны из стартового узла, s
.
dfsearch
и bfsearch
относиться к неориентированным графам так же, как и к ориентированным графам. Неориентированное ребро между узлами s
и t
обрабатывается как два ориентированных ребер, один от s
на t
и один из t
на s
.
Алгоритм поиска Depth-First начинается в стартовом узле, s
, и осматривает соседа s
который имеет наименьший индекс узла. Затем для этого соседа он просматривает следующего неоткрытого соседа с самым низким индексом. Это продолжается до тех пор, пока поиск не встретится с узлом, соседи которого все были посещены. На этой точке поиск переходит назад вдоль пути к ближайшему ранее обнаруженному узлу, который имеет неоткрытый соседний узел. Этот процесс продолжается до тех пор, пока не будут посещены все узлы, которые доступны из начального узла.
В псевдокоде (рекурсивный) алгоритм может быть записан как:
Event startnode(S) Call DFS(S) function DFS(C) Event discovernode(C) FOR edge E from outgoing edges of node C, connecting to node N Event edgetonew(C,E), edgetodiscovered(C,E) or edgetofinished(C,E) (depending on the state of node N) IF event was edgetonew Call DFS(N) END END Event finishnode(C) END
dfsearch
может возвращать флаги для описания различных событий в алгоритме, например, когда обнаружен новый узел или когда были посещены все исходящие ребра узла. Флаги событий перечислены здесь.
Флаг события | Описание события |
---|---|
'discovernode' |
Обнаружен новый узел. |
'finishnode' |
Все исходящие ребра из узла были посещены. |
'startnode' |
Этот флаг указывает начальный узел в поиске. |
'edgetonew' |
Ребро соединяется с неоткрытым узлом |
'edgetodiscovered' |
Ребро соединяется с ранее обнаруженным узлом |
'edgetofinished' |
Ребро соединяется с конечным узлом |
Для получения дополнительной информации смотрите описание входного параметра для events
.
Примечание
В случаях, когда входной график содержит узлы, которые недоступны из стартового узла, 'Restart'
опция предоставляет способ сделать поиск посещающим каждый узел в графике. В этом случае 'startnode'
событие указывает начальный узел каждый раз, когда поиск перезапускается.