Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

13.2. Структуры данных для графов

• Копия x

• Положения вершины связались с вершинами конечной точки e • Положение (или вход) объекта края в коллекции E

Визуализация структуры списка края

601

Мы иллюстрируем пример структуры списка края для графа G в рисунке 13.3.

(a)

(b)

Рисунок 13.3: (a) граф G. (b) Схематическое представление края перечисляют структуру

для G. Мы визуализируем элементы, сохраненные в вершине и объектах края с названиями элемента, вместо с фактическими ссылками на объекты элемента.

Причина эту структуру называют структурой списка края, состоит в том, что самое простое и наиболее распространенное внедрение коллекции края E при помощи списка. Несмотря на это, чтобы быть в состоянии удобно искать конкретные цели, связанные с краями, мы можем хотеть осуществить E со словарем (чьи записи хранят элемент как ключ и край как стоимость) несмотря на наш запрос этого «список края». Мы можем также хотеть осуществить коллекцию V при помощи словаря по той же самой причине. Однако, в соответствии с традицией, мы называем эту структуру структурой списка края.

Главная особенность структуры списка края - то, что она обеспечивает прямой доступ от краев до вершин, на которые они являются инцидентом. Это позволяет нам определять простой algo-rithms для функций e.endVertices () и e.opposite (v).

602 Глава 13. Алгоритмы графа

Исполнение структуры списка края

Один метод, который неэффективен для структуры списка края, является методом доступа к краям, которые являются инцидентом на вершину. Определение этого набора вершин требует исчерпывающего контроля всех объектов края в коллекции E. Таким образом, чтобы определить, какие края - инцидент к вершине v, мы должны исследовать все края в списке края и проверке для каждого, если это, оказывается, инцидент к v. Таким образом функционируйте v.incidentEdges () пробеги, вовремя пропорциональные числу краев в графе, не вовремя пропорциональном степени вершины v. Фактически, даже проверить, смежны ли две вершины v и w v.isAdjacentTo (w) функция, требует, чтобы мы искали всю коллекцию края, ища край с вершинами конца v и w. Кроме того, начиная с удаления вершины включает удаление всех его краев инцидента, функция eraseVertex также требует полного поиска коллекции края E.

Таблица 13.1 суммирует исполнение структуры списка края implemen-tation графа под предположением, что коллекции V и E поняты с вдвойне связанными списками (Раздел 3.3).

Операция

вершины

края

endVertices, напротив

incidentEdges, isAdjacentTo

isIncidentOn insertVertex, insertEdge, eraseEdge,

eraseVertex

Время

O (n) O (m) O (1) O (m) O (1) O (1) O (m)

Таблица 13.1: Продолжительность функций графа, осуществленного с краем, перечисляет структуру. Использованное пространство является O (n + m), где n - число вершин, и m - число краев.

Детали для отобранных функций графа ADT следующие:

• Вершины методов () и края () осуществлены при помощи iterators для V

и E, соответственно, чтобы перечислить элементы списков.

• Методы incidentEdges и isAdjacentTo все берут O (m) время, с тех пор чтобы удержать -

мой, какие края - инцидент на вершину v, мы должны осмотреть все края.

• Так как коллекции V и E - списки, осуществленные с вдвойне связанным списком,

мы можем вставить вершины, и вставить и удалить края в O (1) время.

• Функция обновления eraseVertex (v) берет O (m) время, так как это требует этого

мы осматриваем все края, чтобы найти и удалить тех инцидент на v.

Таким образом представление списка края просто, но имеет значительные ограничения.