
- •Полустатические структуры данных
- •4.1. Характерные особенности полустатических структур
- •4.2. Строки
- •4.2.1. Логическая структура строки
- •4.2.2. Операции над строками
- •4.2.3. Представление строк в памяти
- •Динамические структуры данных. Связные списки
- •5.1. Связное представление данных в памяти
- •5.2. Стеки
- •5.2.1. Логическая структура стека
- •5.2.2. Машинное представление стека и реализация операций
- •5.2.3. Стеки в вычислительных системах
- •5.3. Очереди fifo
- •5.3.1. Логическая структура очереди
- •5.3.2. Машинное представление очереди fifo и реализация операций
- •5.3.3. Очереди с приоритетами
- •5.3.4. Очереди в вычислительных системах
- •5.4. Деки
- •5.4.1. Логическая структура дека
- •5.4.2. Деки в вычислительных системах
- •5.5. Связные линейные списки
- •5.5.1. Машинное представление связных линейных списков
- •5.5.2. Реализация операций над связными линейными списками
- •5.5.3. Применение линейных списков
- •5.6 Мультисписки
- •5.7. Нелинейные разветвленные списки
- •5.7.1. Основные понятия
- •5.7.2. Представление списковых структур в памяти
- •5.7.3. Операции обработки списков
- •5.8. Управление динамически выделяемой памятью
- •6. Деревья
- •6.1. Бинарные деревья
- •6.2. “Прошитые” деревья
- •6.3. Графы
- •6.4. Алгоритмы поиска путей в графе
- •6.4.1. Путь с минимальным количеством промежуточных вершин (волновой алгоритм)
- •6.4.2. Путь минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Дейкстры)
- •6.4.3. Путь минимальной суммарной длины во взвешенном графе с произвольными весами для всех пар вершин (алгоритм Флойда)
- •6.4.4. НахождениеKпутей минимальной суммарной длины во взвешенном графе с неотрицательными весами (алгоритм Йена)
- •7. Классы и объекты
- •8. Рекурсия
- •8.1. Некоторые задачи, где можно применить рекурсию
- •8.2. Использование рекурсии в графике
- •8.2.1. Кривые Гильберта
- •8.2.2. Кривые Серпинского
- •9. Алгоритмы Сжатия информации
- •9.1. Что такое архивирование и зачем оно нужно
- •9.2. Терминология
- •9.3. Методы кодирования
- •9.4. Модели входного потока
- •9.5. Моделирование и энтропия
- •9.6. Адаптированные и неадаптированные модели
- •9.7. Алгоритмы архивации данных
- •9.8. Сжатие способом кодирования серий (rle)
- •9.9. Алгоритм Хаффмана
- •9.10. Арифметическое кодирование
- •9.11. Алгоритм Лемпеля-Зива-Велча (Lempel-Ziv-Welch - lzw)
- •9.11.1. Двухступенчатое кодирование. Алгоритм Лемпеля-Зива
- •Библиографический Список
- •Оглавление
6.3. Графы
Графы - обобобщение структуры деревьев. Граф обычно определяется как некоторое множество точек (называемых вершинами) и некоторое множество линий (называемых ребрами), соединяющих определенные пары вершин. Каждая пара вершин соединяется не больше чем одним ребром.
Можно рассматривать взвешенные и невзвешенные, ориентированные и неориентированные графы. Граф, в котором нет кратных ребер, можно задать при помощи весовой матрицы. Для каждой пары вершин в матрице указывается вес ребра, соединяющего вершины (если ребра нет, то полагаем соответствующий элемент матрицы равным бесконечности). Матрица может быть несимметричной в случае ориентированного графа. В случае невзвешенного графа удобнее представлять его при помощи матрицы связности, элемент которой равен 1, если есть соответствующие ребро, и 0, если ребро отсутствует. Пример использования графа – это задание условий в задаче коммивояжера, причем населенные пункты помещаются в вершины графа, а веса ребер определяют расстояние между соответствующими населенными пунктами.
Теория графов достаточно обширна и многие алгоритмы, рассматриваемые в ней, имеют интерес сами по себе. Для решения прикладных задач часто возникает необходимость определить связаны ли две вершины графа, а в случае наличия весов, определитьеще и вес пути между ними.
Граф (свободное дерево) обычно определяется как некоторое множество точек (называемых вершинами или узлами) и некоторое множество линий, называемых ребрами (или дугами), соединяющих определенные пары вершин. Каждая пара вершин соединяется не больше чем одним ребром. Дуга, соединенная с вершиной, называется инцидентной этой вершине. Две вершины называются смежными, если существует ребро, соединяющее их. Две дуги называются смежными, если они инцидентны одной и той же вершине.
Пусть V и V` - вершины и пусть n0; говорят, что «V0, V1, …, Vn» - путь длины n от V до V`, если V=V0, вершина Vk смежна с Vk+1 при 0kn, а Vn=V`. Путь прост, если вершины V0, V1, …, Vn-1 все различны между собой, а также различны все вершины V1, V2, …, Vn. Граф называется связным, если имеется путь между каждыми двумя вершинами этого графа. Циклом называется простой путь длины не менее 3 от какой-либо вершины до нее самой. Свободное дерево – это связный граф, не имеющий циклов.
Формально направленный граф определяется как некое множество вершин и множество дуг, причем каждая дуга ведет от некоторой вершины V к некоторой вершине V`. Если e – дуга, идущая от V к V`, то говорят, что V – начальная вершина дуги e, а V` - конечная вершина.
Рис. 6.4. Направленный и ненаправленный графы
Для задания графов существует несколько классов матриц, основные из которых класс матриц инциденции и класс матриц смежности.
Класс матриц инциденции. Если граф Г содержит n вершин и m дуг, то матрица инциденции А(Г)=[aij]mxn определяется так:
1,
если вершинаvj
– начало дуги ui;
aij = -1, если вершина vj – конец дуги ui;
0, если дуга ui не инцидентна вершине vj.
Направленный граф на рис. 6.4 можно задать матрицей инциденции:
Класс матриц смежности. Матрица смежности S=[sij]nxm невзвешенного графа определяется следующим образом:
Sij
= 1, если vi
смежна vj;
0, если вершины несмежны.
Во взвешенном графе каждая единица заменяется на вес соответствующего ребра.
Ненаправленный граф на рис. 6.4 описывается следующей матрицей смежности: