Современное состояние программирования нельзя представить себе без теоретико-графовых алгоритмов. Хорошо известно, что многие задачи повышения качества трансляции как в смысле улучшения рабочих характеристик транслятора, так и в смысле повышения качества получаемых машинных программ формулируются и решаются как задачи на графах. Сюда относятся в первую очередь задачи, связанные с представлением программ в виде теоретико-графовых моделей, важнейшей из которых является управляющий граф. Кроме того, необходимо указать на такие области применения граф-моделей, как эффективное использование ресурсов вычислительной системы (оптимизация использования памяти, регистров, уменьшение обменов между оперативной и внешней памятью и т.д.), организация больших массивов информации (деревья и, вообще, графы данных для повышения эффективности информационного поиска), увеличение степени параллелизма программы, повышение эффективности работы многопроцессорных и многомашинных систем (распределение загрузки процессоров, обмен сообщениями между процессами, синхронизация, конфигурация сетей связи между процессорами и т.д.). Решение этих и подобных задач привело к появлению множества граф-моделей, связанных как с программами и структурами данных, так и с вычислительными системами, в том числе параллельными.
Разнообразное применение графов связано с тем, что они являются очень естественным средством объяснения сложных ситуаций на интуитивном уровне. Эти преимущества представления сложных структур и процессов графами становятся еще более ощутимыми при наличии хороших средств их визуализации. Поэтому неслучайно в последнее время в мире растет интерес к методам и системам визуальной обработки графов и графовых моделей. Многие программные системы, особенно те, которые используют информационные модели, включают элементы визуальной обработки графовых объектов. Среди них -- системы и окружения программирования, системы принятия решения, системы автоматизации проектирования и многие другие.
Теория графов из академической дисциплины все более превращается в средство, владение которым становится решающим для успешного применения компьютеров во многих прикладных областях. Несмотря на наличие обширной специальной литературы по решению задач на графах, широкое применение в практике программирования полученных математических результатов затруднено в силу отсутствия систематического их описания, ориентированного на программистов. Поэтому значительный класс практических задач, по существу сводящихся к простому выбору подходящего способа решения и к построению конкретных формулировок абстрактных алгоритмов, для многих программистов все еще остается полем для интеллектуальной деятельности по ``переоткрытию'' методов. Даже известный фундаментальный труд Д. Кнута ``Искусство программирования для ЭВМ'', если бы он и продолжился, как планировалось, не сможет решить эту проблему в силу ориентации Д. Кнута на низкоуровневое (в терминах машины MIX) описание алгоритмов. В изданных же трех томах серии излагается достаточно узкий класс используемых в программировании граф-моделей (фактически Д. Кнут ограничился рассмотрением деревьев и уже не планирует продолжать работу над серией).
Предлагаемая вниманию читателя книга является одной из первых попыток систематизации знаний по алгоритмам теории графов для программиста.
В отличие от Д. Кнута мы ориентируемся на абстрактную модель современных ЭВМ (равнодоступная адресная машина -- РАМ) и высокоуровневое описание алгоритмов в терминах специального языка высокого уровня -- ВУ-язык. Этот язык является псевдоязыком (лексиконом) программирования и содержит в качестве базовых традиционные конструкции математики и языков программирования. Наряду с обычными для современных языков типами простых и составных данных он допускает такие более сложные структуры данных, как, например, деревья, графы и т.д. Для каждой базовой конструкции ВУ-языка фиксируется класс её допустимых реализаций на РАМ. Предполагается, что ВУ-язык позволяет наряду с базовыми использовать любые необходимые конструкции, если очевидны или заранее зафиксированы оценки их сложности, а также те реализации этих конструкций на РАМ, которые допускают такие оценки. Такой подход позволяет формулировать алгоритмы в естественной форме, допускающей прямой анализ их корректности и сложности, а также простой перенос алгоритмов на традиционные языки программирования и ЭВМ с сохранением полученных оценок сложности. Кроме того, подобный стиль описания алгоритмов является базой для доказательного стиля программирования: он позволяет понять алгоритм на содержательном уровне, оценить пригодность его для решения конкретной задачи и осуществить модификацию алгоритма, не снижая степень математической достоверности окончательного варианта программы.
Первая книга по теории графов появилась в 1935 г., однако, началом широкого внедрения методов теории графов в практику научных и технических исследований следует считать 50-е годы XX века. В те годы были опубликованы отчёты американской корпорации RAND по математическим исследованиям в военной области, которые проводились в США во время и после окончания Второй мировой войны. Книги по теории графов (К. Берж, Р. Басакер и Т. Саати), вышедшие в начале 60-х годов, уже содержали материалы, относящиеся к приложениям теории графов в исследовании операций, дискретной оптимизации, электротехнике и пр. Затем последовали книги, посвящённые алгоритмическим проблемам теории графов и вопросам применения теории графов в отдельных областях знаний, в том числе в программировании. Среди них нужно назвать ``Введение в теоретическое программирование. Беседы о методе'' А.П. Ершова (1977 г.), ``Применение теории графов в программировании'' В.А. Евстигнеева (1985 г.), ``Оптимизирующие преобразования программ'' В.Н. Касьянова (1988 г.), ``Комбинаторика для программистов'' В. Липского (1988 г.).
Заметим, что любая из книг, содержащих теоретико-графовые алгоритмы, оставалась либо книгой по теории графов, либо книгой по основной предметной области, использующей теоретико-графовые методы. Развивая эту тематику, мы решили объединить в одной книге графовые алгоритмы решения для графовых задач, и задачи по программированию вместе со специфическими алгоритмами их решения, основанными или использующими теоретико-графовые методы и алгоритмы. Этот подход подсказал нам идею разбить всё множество графов, которые наиболее часто встречаются в практике решения задач программирования, на классы, объединив вокруг каждого такого класса соответствующие задачи из информатики и программирования. Такими классами выступили классы деревьев, бесконтурных (или ациклических) графов и сводимых (или регуляризуемых) графов. Заметим, что последние два класса относятся к ориентированным графам, а из класса деревьев используется подкласс корневых деревьев, что также относится к ориентированным графам. Данный подход был успешно реализован нами в книгах ``Теория графов: алгоритмы обработки деревьев'' (1994 г.), ``Теория графов: алгоритмы обработки бесконтурных графов'' (1998 г.), ``Сводимые графы и граф-модели в программировании'' (1999 г.) и ``Толковый словарь по теории графов и ее применению в информатике и программировании'' (1999 г.). Однако небольшой тираж этих книг сделал их недоступными студентам и специалистам по программированию.
Предлагаемая книга объединяет и существенно расширяет материал перечисленных книг, что позволит более эффективно использовать предлагаемые методы и алгоритмы. Впервые в отечественной литературе в ней дается монографическое изложение материала по вопросам рисования графов и визуальной обработки графовых моделей.
Книга состоит из 12-ти глав и 2-х приложений, образующих три части.
Часть I посвящена обработке и визуализации графов. Основная задача этой части, состоящей из пяти глав, -- описать базовые модели и алгоритмы, связанные с применением теории графов в программировании, включая вопросы визуализации и рисования графов. Изложение материала привязано к трём основным типам графов: деревья, дэги или бесконтурные графы и сводимые или регуляризуемые графы. Отдельно рассматриваются основные теретико-графовые понятия и методы рисования и визуальной обработки графовых моделей.
В части II, состоящей из семи глав, сосредоточен основной материал по применению графов и граф-моделей в программировании и информатике. В ней подробно рассмотрены использования графовых моделей в таких основных областях приложения, как хранение и поиск информации, трансляция и оптимизация программ, анализ, преобразование и распараллеливание программ, параллельная и распределенная обработка информации.
Часть III содержит справочный материал и состоит из двух приложений. Приложение 1 посвящено ``переборным'' (NP-полным) задачам, в котором наряду с введением понятия NP-полноты и рассмотрением списков NP-полных задач из различных областей программирования и информатики, описываются РАМ и ВУ-язык, используемые в книге для представления и анализа алгоритмов. В приложении 2 приведены характеристики размещений графов, включая размер области размещения, оценки величины углов, число сгибов и пр.
Формулировки основных свойств получают буквенные обозначения (А, Б, В, Г и т.д.) внутри каждого раздела, и ссылка на свойство в тексте образуется из номера раздела и его буквенного обозначения, например, свойство 1.2.3, А указывает на свойство А из раздела 1.2.3. Если производится ссылка на свойство в том же разделе, то номер раздела может опускаться.
Рисунки в книге выполнены авторами с использованием системы для работы с графами HIGRES.
Читатель, желающий расширить свои знания по применению графов в программировании, может использовать краткие обзоры и комментарии, завершающие главы и приложения книги и содержащие ссылки на основные и доступные работы с дополнительным материалом по теории-графов и ее применении в программировании. В основном тексте ссылки на литературу, как правило, отсутствуют. Списки литературы в конце глав и приложений ни в коей мере не претендует на библиографическую полноту; за редким исключением, они содержат только публикации, упоминаемые в кратких обзорах и комментариях.
Монография основывается на работах авторов в рамках проектов, которые выполнялись в лаборатории конструирования и оптимизации программ Института систем информатики Сибирского отделения Российской академии наук (ИСИ СО РАН) и на кафедре программирования Новосибирского государственного университета (НГУ) при финансовой поддержке Российского фонда фундаментальных исследований (РФФИ) и Минобразования. Авторы благодарны всем коллегам, принимавшим участие в выполнении этих проектов, в первую очередь И.А. Лисицыну, Е.С. Мердишевой, Т.С. Мердишевой, В.Е. Казанцеву, Д.Е. Бабурину и И.Л. Мирзуитовой.
Нельзя не назвать и тех, кто своими работами, советами и поддержкой способствовал появлению этой книги. Прежде всего -- это А.П. Ершов, С.С. Лавров, А.А. Летичевский, Э.З. Любимский, В.Е. Котов, В.К. Попков и А.А. Берс. Всем им, а также И.П. Мелинг и Л.К. Грушецкой, оказавшим большую помощь в технической подготовке рукописи, авторы выражают искреннюю признательность.
Наконец авторы благодарят своих жен (Светлану Николаевну и Людмилу Анатольевну) и детей (Елену Викторовну, Александра Владимировича и Надежду Владимировну) за любовь и поддержку при работе над книгой (Светлана Николаевна также помогла нам с подготовкой большинства иллюстраций). Любовь, терпение и поддержка наших близких сделали эту книгу возможной, им она и посвящается.
Книга такого объема не может не содержать ошибки. Мы будем благодарны за любые замечания и пожелания. Присылайте их нам по адресу: ИСИ СО РАН, Новосибирск, 630090. Можно также получить список известных опечаток и сообщить о найденных ошибках по электронной почте и на страницах Web-сайта лаборатории конструирования и оптимизации программ ИСИ СО РАН. Чтобы получить инструкции, по адресу graphs@pco.iis.nsk.su отправьте письмо, содержащее слово Help в качестве темы письма. Извините, если мы не сможем лично ответить на все письма.
Книга предназначена для широкого круга специалистов, использующих методы теории графов при решении своих задач, в первую очередь для системных и прикладных программистов, а также для специалистов по системам автоматизации проектирования (САПР), конструкторов сверх больших интегральных схем (СБИС) и т.д. Она может быть использована в качестве учебного пособия студентами высших учебных заведений, аспирантами и преподавателями, читающими соответствующие курсы. В принципе книга самодостаточна, т.е. содержит весь необходимый материал, всё же желательно предварительное знакомство с основами теории графов и программирования.