2. Для реализации многих приложений выбор
структуры данных - единственное важное
решение: когда выбор сделан, разработка
алгоритмов не вызывает затруднений.
Выбор алгоритмов и структур данных тесно
взаимосвязан.
Одними из основных структур данных,
используемых в программировании, являются
графы.
Графы используются для:
• компьютерной обработки географических карт
(геоинформационные задачи);
• решения поисковых задач (например, в
организации поиска в сети Интернет);
• в системах автоматизированного
проектирования (например, при компоновке
микросхем на плате);
3. • для управления информацией (например, в
распределенных системах и сетях);
• в календарном планировании (например, с
помощью сетевых графиков);
• при компиляции программ;
• графы применяются и при решении других
задач.
Имеется два стандартных способа представления
графа G = (V, E): как набора списков смежных
вершин или как матрицы смежности. Оба
способа представления применимы как для
ориентированных, так и для неориентированных
графов.
4. Обычно более предпочтительно представление с
помощью списков смежности, поскольку оно
обеспечивает компактное представление
разреженных графов, т.е. таких, для которых |Е|
гораздо меньше |V|2. Представление при помощи
матрицы смежности предпочтительнее в случае
плотных графов, т.е. когда значение |Е| близко к |
V|2 или когда необходимо получить возможность
быстро определить, имеется ли ребро,
соединяющие две данные вершины.
Представление графа G = (V, E) в виде списка
смежности использует массив Adj из |V| списков,
по одному для каждой вершины из V. Для каждой
вершины u ∈ V список Adj[u] содержит все
вершины v, такие что (u,v) ∈ Е, т.е. Adj[u] состоит
из всех вершин, смежных с u в графе G.
5. На рис. 1 показано представление графа (а)
в виде списка смежности (б) и матрицы
смежности (в).
1
3
5
4
а) Граф
1
2
3
4
5
2
1
2
2
1
5
3
4
3
2
1
4
5
4
б) Список смежности
Рис. 1. Представление графа
5
2
3
4
5
1
0
1
0
0
1
2
1
0
1
1
1
3
0
1
0
1
0
4
2
0
1
0
5
1
1
1
1
0
0
1
в) Матрица смежности
6. Если G – ориентированный граф, то сумма длин всех
списков смежности равна |Е| поскольку ребру (u,v)
однозначно соответствует элемент v в списке Adj[u].
Если G – неориентированный граф, то сумма длин
всех списков смежности равна 2|Е|, поскольку ребро
(u,v), будучи неориентированным, появляется в
списке Adj[v] как u, и в списке Adj[u] – как v. Как для
ориентированных, так и для неориентированных
графов представление в виде списков требует объем
памяти, равный Θ(|V| + |Е|).
Списки смежности легко адаптируются для
представления взвешенных графов, т.е. графов, с
каждым ребром которых связан определенный вес,
обычно определяемый весовой функцией w: Е → R.
Например, пусть G = (V, Е) – взвешенный граф с
весовой функцией w. Вес w(u, v) ребра (u, v) ∈ Е
просто хранится вместе с вершиной v в списке
смежности u.
7. Потенциальный недостаток представления при
помощи списков смежности заключается в том,
что при этом нет более быстрого способа
определить, имеется ли данное ребро (u, v) в
графе, чем поиск v в списке Adj[u]. Этот
недостаток можно устранить ценой
использования асимптотически большего
количества памяти и представления графа с
помощью матрицы смежности.
Представление графа G = (V, Е) с помощью
матрицы смежности предполагает, что вершины
перенумерованы в некотором порядке числами
1,2,...,|V|. В таком случае представление графа G
с использованием матрицы смежности
представляет собой матрицу A = (аij) размером |
V|×|V|, такую что
8. 1
, (i, j ) ∈E ,
aij =
0
, (i, j ) ∉E.
Матрица смежности графа требует объем
памяти, равный Θ(|V|2), независимо от
количества ребер графа.
Например, если G = (V, Е) – взвешенный граф с
весовой функцией w, то вес w(u, v) ребра (u,
v) ∈ Е хранится в записи в строке u и столбце
v матрицы смежности. Если ребро не
существует, то в соответствующем элементе
матрицы хранится некоторое определенное
значение (например, 0 или wmax).
9. Кроме указанных представлений графа в
виде списка смежности и матрицы
смежности в некоторых задачах
используются и некоторые другие.
Например, иногда применяется матрица
инциденций. Матрицей инциденций
неориентированного графа G = (V, Е)
является матрица B = (bij) размером |V|×|
E|, такая что
1 если ребро j инцидентно вершине i,
bij =
0 в противном случае.
10. Для представления ориентированного
графа элемент матрицы инциденций
определяется следующим образом:
− 1 если ребро j выходит из вершины i,
bij = 1 если ребро j входит в вершину i,
0 в противном случае.
Очевидно, что все указанные представления
графов можно реализовать с помощью
массивов и/или указателей.
При разработке программ часто
применяются графы определенного вида –
деревья.
11. Существуют различные типы деревьев:
• деревья,
• корневые деревья,
• упорядоченные деревья,
• M-арные деревья,
• бинарные деревья.
Для представления деревьев также можно использовать
список смежности и матрицу смежности. Чаще
используют связные списки.
Например, бинарное дерево (рис. 2) можно представить
в виде списка вершин, каждая из которых ссылается
на две дочерние вершины (левую и правую). Список
начинается с корня. Любое другое корневое дерево
можно представить в виде бинарного дерева.
Например, M-арное дерево можно представить в виде
бинарного, в котором каждая вершина ссылается на
первого потомка и следующего брата.
12. 1
1
2
4
2
3
5
6
7
4
3
5
6
7
а) Бинарное
б) Ссылочная структура
дерево
Рис. 2. Представление
бинарного дерева
Реализовать связный список для
представления бинарного дерева можно с
помощью указателей и/или массивов,
имеющихся в выбранном языке
программирования.
13. 2. Вопросы эффективности
для структур данных
Эффективность конкретной структуры данных зависит от
задачи и ресурсов, имеющихся для ее решения.
Если в графе много вершин, причем каждая из них связана
лишь с небольшим количеством других вершин, список
смежности оказывается выгоднее, поскольку он занимает
меньше места, а длина просматриваемых списков вершин
невелика. Если же число вершин в графе мало, то лучше
воспользоваться матрицей смежности: она будет
небольшой, и даже потери при хранении в матричном виде
разреженного графа будут незначительны. Если же в
графе много ребер и он почти полный, то матрица
смежности всегда является лучшим способом хранения
графа. Однако если рассматриваемый граф является
деревом, то с учетом того, что каждая вершина может быть
связана только со своими родителем и потомками, то и
список смежности и матрица смежности неэкономично
расходуют память. В этом случае лучше воспользоваться
ссылочной структурой.