Здравствуйте прошла курсы на тему Алгоритмы С++. Но не пришел сертификат и не доступен.Где и как можно его скаачат? |
Виды графов и их свойства
Во многих вычислительных приложениях естественным образом используется не только набор элементов (item), но и набор связей (connection) между парами этих элементов. Отношения, которые вытекают из этих связей, немедленно вызывают множество естественных вопросов. Существует ли путь, состоящий из связей, от одного такого элемента к другому? В какие другие элементы можно перейти из заданного элемента? Каков наилучший путь от одного элемента к другому?
Для моделирования таких ситуаций мы будем пользоваться объектами, которые называются графами (graph). В данной главе мы подробно рассмотрим основные свойства графов и заложим основу для изучения всевозможных алгоритмов, которые помогут ответить на вопросы, подобные сформулированным выше. Эти алгоритмы часто используют различные вычислительные средства, рассмотренные в частях I—IV. Они также служат тем фундаментом, без которого невозможно подступиться ко многим важным задачам, и решение которых нельзя представить без привлечения солидной алгоритмической технологии.
Теория графов, будучи крупной ветвью комбинаторной математики, интенсивно изучалась в течение не одной сотни лет. Было выявлено много важных и полезных свойств графов, однако многие задачи еще ждут своего решения. В этой книге мы извлечем из разнообразных знаний о графах лишь небольшую часть -все то, что нам необходимо знать -и изучим множество полезных фундаментальных алгоритмов.
Как и многие другие задачи, которые нам уже довелось рассмотреть, алгоритмическое изучение графов -в основном молодая отрасль знаний. Хотя некоторые фундаментальные алгоритмы открыты давно, все же большинство интереснейших алгоритмов получено в течение нескольких последних десятилетий. Даже простейшие алгоритмы на графах позволяют получить полезные компьютерные программы, а нетривиальные алгоритмы, которые нам предстоит разобрать, относятся к числу наиболее элегантных и интересных из известных алгоритмов.
Чтобы продемонстрировать все разнообразие приложений, использующих графы для обработки данных, начнем изучение алгоритмов в этой области с рассмотрения нескольких примеров.
- Географические карты. Путешественник, прежде чем отправиться в путь, желает получить ответ на вопросы типа: " Какой маршрут из Принстона в Сан-Хосе потребует наименьших расходов? " Пассажир, для которого время дороже денег, хотел бы получить ответ на такой вопрос: " Каким путем быстрее всего добраться из Принстона в Сан-Хосе? " Для ответа на подобные вопросы необходима обработка информации о связях (маршрутах) между элементами (населенными пунктами).
- Гипертекст. Большинство документов в Web содержат различные ссылки на другие документы, которые позволяют переходить от документа к документу, щелкая на них мышью. Всемирная сеть представляет собой граф, в котором в качестве элементов выступают документы, а в качестве связей выступают ссылки. Алгоритмы обработки графов являются важными компонентами поисковых механизмов, которые помогают определить местоположение информации в Web.
- Микросхемы. Микросхемы содержат такие элементы, как транзисторы, резисторы, конденсаторы, которые соединены между собой сложнейшим образом. Для управления машинами, изготавливающими микросхемы, и для проверки, выполняют ли они нужные функции, используются компьютеры. Мы хотим получить ответы на простые вопросы наподобие " Имеются ли здесь короткие замыкания? " и на более сложные вопросы, такие как " Можно ли скомпоновать микросхему на кристалле без пересечения проводников? " В данном случае, ответ на первый вопрос зависит только от свойств связей (проводников), а для ответа на второй вопрос потребуется подробная информация о проводниках, элементах, которые они соединяют, и физических ограничениях, накладываемых кристаллом.
- Расписания. Многие производственные процессы требуют решения различных задач при условии, что решение одной задачи не может быть начато до тех пор, пока не будет завершено решение каких-то других задач. Такие условия можно представить в виде связей между этими задачами (элементами), и возникает задача составления расписаний (scheduling) в ее классическом виде: как составить график решения задач таким образом, чтобы соблюсти все заданные условия и завершить весь процесс за минимально возможное время?
- Транзакции. Телефонная компания ведет базу данных телефонного трафика. В этом случае связи соответствуют телефонным звонкам. Компания хочет знать характер структуры соединений, чтобы провести линии и установить коммутаторы для эффективной работы с телефонным трафиком. Другой пример -финансовое учреждение отслеживает операции купли/продажи на рынке. Здесь связи представляют собой пересылки денег между клиентами. Знание свойств структуры связей в данном случае помогает лучше понять поведение рынка.
- Поиск сопоставлений. Студенты хотят принимать участие в таких учреждениях, как общественные клубы, университеты или медицинские учебные заведения. Элементы соответствуют студентам и учреждениям, а связи -членству. Нужны методы распределения студентов по вакансиям.
- Сети. Компьютерная сеть состоит из взаимосвязанных узлов, которые посылают, получают и передают дальше различные сообщения. Необходимо обеспечить не только возможность пересылки сообщений из любого узла в любой другой узел, но и сохранение этой возможности для всех пар узлов при изменении конфигурации сети. Например, для конкретной сети может потребоваться проверить, существует ли в ней такое небольшое подмножество узлов или связей, что его отключение может привести к разъединению остальных пар узлов.
- Структура программы. Компилятор строит графы для представления структуры вызовов в большой программной системе. Элементами в этом случае являются различные функции или модули, составляющие систему; а связи отождествляются либо с возможностью вызова одной функции другой (статический анализ), либо с фактическими вызовами при работе системы (динамический анализ). Для максимально эффективного выделения системных ресурсов нужен анализ графа.
Эти примеры демонстрируют диапазон приложений, для которых граф служит подходящей абстракцией, и, соответственно, диапазон вычислительных задач, с которыми доведется столкнуться при работе с графами. Такие задачи и являются главной темой настоящей книги. Во многих подобных приложениях, которые могут встретиться на практике, объем данных просто огромен, поэтому эффективность алгоритма означает, будет ли вообще найдено решение.
Нам уже приходилось сталкиваться с графами в части I. Ведь самые первые рассмотренные нами алгоритмы -алгоритмы объединения-поиска, описанные в "Введение" -представляют собой простейшие алгоритмы на графах. В "Элементарные структуры данных" графы послужили иллюстрацией применений двумерных массивов и связных списков, а в "Рекурсия и деревья" графы применялись для демонстрации связи между рекурсивными программами и фундаментальными структурами данных. Любую связную структуру данных можно представить в виде графа, а некоторые известные алгоритмы обработки деревьев и других связных структур представляют собой частные случаи алгоритмов на графах. Данная глава обеспечит контекст для изучения алгоритмов на графах -от простейших, приведенных в части I, до очень сложных, описываемых в лекциях 18—22.
Как всегда, мы хотим знать, какой из возможных алгоритмов решения конкретной задачи наиболее эффективен. Изучение характеристик производительности алгоритмов на графах представляет собой довольно сложную задачу, поскольку
- затраты на выполнение алгоритма зависят не только от свойств множества элементов, но и от многочисленных свойств множества связей (и глобальных свойств графа, обусловленного этими связями);
- трудно разработать точные модели видов графов, с которыми, возможно, придется столкнуться.
Мы часто оцениваем границы производительности алгоритмов на графах в худшем случае, даже если они весьма пессимистичны. К счастью, как мы увидим, многие алгоритмы оптимальны и не требуют больших излишних затрат. Другая группа алгоритмов затрачивает одинаковый объем ресурсов на обработку всех графов заданного размера. Мы можем с достаточной степенью точности предсказать, как поведут себя такие алгоритмы в конкретных ситуациях. В тех случаях, когда такие предсказания невозможны, придется уделить особое внимание свойствам различных видов графов, которые могут появиться на практике, и оценить, как эти свойства могут повлиять на производительность алгоритмов.
Мы начнем с изучения основных определений графов и свойств графов, а также со стандартной терминологии, которая используется для их описания. Потом мы определим интерфейсы АТД (абстрактных типов данных), которыми будем пользоваться при изучении алгоритмов на графах, и две наиболее важные структуры данных, применяемых для представления графов -матрицы смежности и списки смежности, а также различные способы реализации базовых функций АТД. Затем мы рассмотрим клиентские программы для генерации случайных графов, которые могут использоваться для тестирования алгоритмов и для изучения свойств графов. Используя весь этот материал в качестве базы, мы познакомимся с алгоритмами для решения трех классических задач поиска путей в графах, которые продемонстрируют, что задачи обработки графов существенно отличаются друг от друга по сложности даже в тех случаях, когда внешне они довольно похожи. Глава завершается обзором наиболее важных задач обработки графов, которые будут рассмотрены в этой книге в порядке сложности их решений.