Мегаобучалка Главная | О нас | Обратная связь


Оперирование узлами и связями



2019-07-03 287 Обсуждений (0)
Оперирование узлами и связями 0.00 из 5.00 0 оценок




Корень дерева — это единственный узел, не имеющий родителя. Можно найти любой узел в сети, начав от корня и следуя по указателям на дочерние узлы. Таким образом, узел представляет основание дерева. Если ввести переменную, которая будет содержать указатель на корневой узел, то впоследствии можно будет получить доступ ко всем узлам в дереве.

Сети не всегда содержат узел, который занимает такое особое положение. В несвязной сети может не существовать способа обойти все узлы по связям, начав с одного узла.

Поэтому программы, работающие с сетями, обычно содержат полный список всех узлов в сети. Программа также может хранить полный список всех связей. При помощи этих списков можно легко выполнить какие‑либо действия над всеми узлами или связями в сети. Например, если программа хранит указатели на узлы и связи в коллекциях Nodes и Links, она может вывести сеть на экран при помощи следующего метода:

 

@Рис. 12.3. Программа NetEdit

 

=======316

 

 

Dim node As NetworkNode

dim link As NetworkLink

For Each link in links

   ' Нарисовать связь.

      :

Next link

 

For Each node in nodes

   ' Нарисовать узел.

      :

Next node

 

Программа NetEdit использует коллекции Nodes и Links для вывода сетей на экран.

Обходы сети

Обход сети выполняется аналогично обходу дерева. Можно обходить сеть, используя либо обход в глубину, либо обход в ширину. Обход в ширину обычно похож на прямой обход дерева, хотя для сетей можно определить также обратный и даже симметричный обход.

Алгоритм для выполнения прямого обхода двоичного дерева, описанный в 6 главе, формулируется так:

Обратиться к узлу.

Выполнить рекурсивный прямой обход левого поддерева.

Выполнить рекурсивный прямой обход правого поддерева.

В дереве между связанными между собой узлами существует отношение родитель‑потомок. Так как алгоритм начинается с корневого узла и всегда выполняется сверху вниз, он не обращается дважды ни к одному узлу.

В сети узлы не обязательно связаны в направлении сверху вниз. Если попытаться применить к сети алгоритм прямого обхода, может возникнуть бесконечный цикл.

Чтобы избежать этого, алгоритм должен помечать узел после обращения к нему, при этом при поиске в соседних узлах, обращение происходит только к узлам, которые еще не были помечены. После того, как алгоритм завершит работу, все узлы в сети будут помечены (если сеть является связной). Алгоритм прямого обхода сети формулируется так:

Пометить узел.

Обратиться к узлу.

Выполнить рекурсивный обход не помеченных соседних узлов.

 

========317

 

В Visual Basic можно добавить флаг Marked к классу NetworkNode.

 

Public Id As Long

Public Marked As Boolean

Public Links As Collection

 

Класс NetworkNode может включать открытую процедуру для обхода сети, начиная с этого узла. Процедура узла PreorderPrint обращается ко всем непомеченным узлам, которые доступны из данного узла. Если сеть является связной, то при таком обходе произойдет обращение ко всем узлам сети.

 

Public Sub PreorderPrint()

Dim link As NoworkLink

Dim node As NetworkNode

 

' Пометить узел.

Marked = True

 

' Обратиться к непомеченным узлам.

For Each link In Links

   ' Найти соседний узел.

   If link.Node1 Is Me Then

      Set node = link.Node2

   Else

      Set node = link.Node1

   End If

 

   ' Определить, требуется ли обращение к соседнему узлу.

   If Not node.Marked Then node.PreorderPrint

Next link

End Sub

 

Так как эта процедура не обращается ни к одному узлу дважды, то коллекция обходимых связей не содержит циклов и образует дерево.

Если сеть является связной, то дерево будет обходить все узлы сети. Так как это дерево охватывает все узлы сети, то оно называется остовным деревом (spanning tree). На рис. 12.4 показана небольшая сеть с остовным деревом с корнем в узле A, которое изображено жирными линиями.

Можно использовать похожий подход с пометкой узлов для преобразования обхода дерева в ширину в сетевой алгоритм. Алгоритм обхода дерева начинается с помещения корневого узла в очередь. Затем первый узел удаляется из очереди, происходит обращение к узлу, и затем в конце очереди помещаются его дочерние узлы. Затем этот процесс повторяется до тех пор, пока очередь не опустеет.

 

======318

 

@Рис. 12.4. Остовное дерево

 

В алгоритме обхода сети нужно вначале убедиться, что узел не проверялся раньше или он уже не находится в очереди. Для этого мы помечаем каждый узел, который помещается в очередь. Сетевая версия этого алгоритма выглядит так:

Пометить первый узел (который будет корнем остовного дерева) и добавить его в конец очереди.

Повторять следующие шаги до тех пор, пока очередь не опустеет:

a) Удалить из очереди первый узел и обратиться к нему.

b) Для каждого из непомеченных соседних узлов, пометить его и добавить в конец очереди.

Следующая процедура печатает список узлов сети в порядке обхода в ширину:

 

Public Sub BreadthFirstPrint(root As NetworkNode)

Dim queue As New Collection

Dim node As NetworkNode

Dim neighbor As NetworkNode

Dim link As NetworkLink

 

' Поместить корень в очередь.

root.Marked = True

queue.Add root

 

' Многократно помещать верхний элемент в очередь

' пока очередь не опустеет.

Do While queue.Count > 0

   ' Выбрать следующий узел из очереди.

   Set node = queue.Item(1)

   queue.Remove 1

 

   ' Обратиться к узлу.

   Print node.Id

 

   ' Добавить в очередь все непомеченные соседние узлы.

   For Each link In node.Links

      ' Найти соседний узел.

      If link.Node1 Is Me Then

          Set neighbor = link.Node2

      Else

          Set neighbor = link.Node1

      End If

 

      ' Проверить, нужно ли обращение к соседнему узлу.

      If Not neighbor.Marked Then queue.Add neighbor

   Next link

Loop

End Sub

 



2019-07-03 287 Обсуждений (0)
Оперирование узлами и связями 0.00 из 5.00 0 оценок









Обсуждение в статье: Оперирование узлами и связями

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (287)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.005 сек.)