Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Глава 17. Свойства и типы графов. Конструктор графа принимает максимально возможное число вершин графа в качестве аргумента с тем, чтобы реализации могли выделять соответствующее
Конструктор графа принимает максимально возможное число вершин графа в качестве аргумента с тем, чтобы реализации могли выделять соответствующее пространство памяти. Мы принимаем это соглашение единственно с целью сделать программный код по возможности компактным и удобным для чтения. Более универсальный граф может включать в свой интерфейс возможность добавления и удаления как вершин, так и ребер; это обстоятельство налагает более строгие требования на структуры данных, используемые для реализации АТД. Мы можем остановить свой выбор на некотором промежуточном уровне абстракции и учитывать возможность разработки интерфейсов, поддерживающих высокоуровневые абстрактные операции для работы с графами, которые можно использовать в реализациях. Мы еще раз коротко проанализируем эту идею в разделе 17.5 после того, как рассмотрим несколько конкретных представлений и реализаций. В АТД графа общего вида следует учитывать параллельные ребра и петли, поскольку ничто не мешает клиентской программе вызвать функцию insert с использованием в качестве параметра ребра, которое уже существует (параллельное ребро), или ребра с одинаковыми индексами вершин, его образующих. Возможно, что в некоторых приложениях придется запретить использование таких ребер, зато в других приложениях их включение желательно, а в некоторых приложениях они попросту игнорируются. Манипулирование петлями тривиально, в то время как поддержка параллельных ребер требует существенных затрат ресурсов в зависимости от представления графа. В некоторых ситуациях целесообразно включить функцию АТД удалить параллельные ребра {remove parallel edges). Далее, реализации могут разрешить объединение параллельных ребер, а клиентские программы могут их удалять или выполнять над параллельными ребрами другие операции, если получат на то соответствующие полномочия. Мы вернемся к рассмотрению этих проблем в разделах 17.4 и 17.5. Программа 17.2 представляет собой функцию, которая служит иллюстрацией использования класса итератора в АТД графа. Эта функция извлекает из графа некоторое множество ребер и передает их функции vector из библиотеки STL (Standard Template Library — стандартная библиотека шаблонов) C++, которая выполняет построение вектора. Сам граф есть ни что иное, как множество ребер, и нам довольно часто нужно получить граф именно в такой форме, независимо от его внутреннего представления. Порядок, в котором ребра располагаются в векторе, не играет роли и меняется от приложения к приложению. Мы используем шаблон этих функций с тем, чтобы обеспечить возможность использования различных реализаций АДТ графа.
|