Основные структуры
данных

1. Стратегии реализации
графов и деревьев
Для реализации многих приложений выбор
структуры данных - единственное важное
решение: когда выбор сделан, разработка
алгоритмов не вызывает затруднений.
Выбор алгоритмов и структур данных тесно
взаимосвязан.
Одними из основных структур данных,
используемых в программировании, являются
графы.
Графы используются для:
• компьютерной обработки географических карт
(геоинформационные задачи);
• решения поисковых задач (например, в
организации поиска в сети Интернет);
• в системах автоматизированного
проектирования (например, при компоновке
микросхем на плате);
• для управления информацией (например, в
распределенных системах и сетях);
• в календарном планировании (например, с
помощью сетевых графиков);
• при компиляции программ;
• графы применяются и при решении других
задач.
Имеется два стандартных способа представления
графа G = (V, E): как набора списков смежных
вершин или как матрицы смежности. Оба
способа представления применимы как для
ориентированных, так и для неориентированных
графов.
Обычно более предпочтительно представление с
помощью списков смежности, поскольку оно
обеспечивает компактное представление
разреженных графов, т.е. таких, для которых |Е|
гораздо меньше |V|2. Представление при помощи
матрицы смежности предпочтительнее в случае
плотных графов, т.е. когда значение |Е| близко к |
V|2 или когда необходимо получить возможность
быстро определить, имеется ли ребро,
соединяющие две данные вершины.
Представление графа G = (V, E) в виде списка
смежности использует массив Adj из |V| списков,
по одному для каждой вершины из V. Для каждой
вершины u ∈ V список Adj[u] содержит все
вершины v, такие что (u,v) ∈ Е, т.е. Adj[u] состоит
из всех вершин, смежных с u в графе G.
На рис. 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

в) Матрица смежности
Если 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.
Потенциальный недостаток представления при
помощи списков смежности заключается в том,
что при этом нет более быстрого способа
определить, имеется ли данное ребро (u, v) в
графе, чем поиск v в списке Adj[u]. Этот
недостаток можно устранить ценой
использования асимптотически большего
количества памяти и представления графа с
помощью матрицы смежности.
Представление графа G = (V, Е) с помощью
матрицы смежности предполагает, что вершины
перенумерованы в некотором порядке числами
1,2,...,|V|. В таком случае представление графа G
с использованием матрицы смежности
представляет собой матрицу A = (аij) размером |
V|×|V|, такую что
1
 , (i, j ) ∈E ,
aij = 
0
 , (i, j ) ∉E.

Матрица смежности графа требует объем
памяти, равный Θ(|V|2), независимо от
количества ребер графа.
Например, если G = (V, Е) – взвешенный граф с
весовой функцией w, то вес w(u, v) ребра (u,
v) ∈ Е хранится в записи в строке u и столбце
v матрицы смежности. Если ребро не
существует, то в соответствующем элементе
матрицы хранится некоторое определенное
значение (например, 0 или wmax).
Кроме указанных представлений графа в
виде списка смежности и матрицы
смежности в некоторых задачах
используются и некоторые другие.
Например, иногда применяется матрица
инциденций. Матрицей инциденций
неориентированного графа G = (V, Е)
является матрица B = (bij) размером |V|×|
E|, такая что
1 если ребро j инцидентно вершине i,
bij = 
0 в противном случае.
Для представления ориентированного
графа элемент матрицы инциденций
определяется следующим образом:
− 1 если ребро j выходит из вершины i,

bij =  1 если ребро j входит в вершину i,
 0 в противном случае.


Очевидно, что все указанные представления
графов можно реализовать с помощью
массивов и/или указателей.
При разработке программ часто
применяются графы определенного вида –
деревья.
Существуют различные типы деревьев:
• деревья,
• корневые деревья,
• упорядоченные деревья,
• M-арные деревья,
• бинарные деревья.
Для представления деревьев также можно использовать
список смежности и матрицу смежности. Чаще
используют связные списки.
Например, бинарное дерево (рис. 2) можно представить
в виде списка вершин, каждая из которых ссылается
на две дочерние вершины (левую и правую). Список
начинается с корня. Любое другое корневое дерево
можно представить в виде бинарного дерева.
Например, M-арное дерево можно представить в виде
бинарного, в котором каждая вершина ссылается на
первого потомка и следующего брата.
1

1
2

4

2

3
5

6

7

4

3
5

6

7

а) Бинарное
б) Ссылочная структура
дерево
Рис. 2. Представление
бинарного дерева

Реализовать связный список для
представления бинарного дерева можно с
помощью указателей и/или массивов,
имеющихся в выбранном языке
программирования.
2. Вопросы эффективности
для структур данных
Эффективность конкретной структуры данных зависит от
задачи и ресурсов, имеющихся для ее решения.
Если в графе много вершин, причем каждая из них связана
лишь с небольшим количеством других вершин, список
смежности оказывается выгоднее, поскольку он занимает
меньше места, а длина просматриваемых списков вершин
невелика. Если же число вершин в графе мало, то лучше
воспользоваться матрицей смежности: она будет
небольшой, и даже потери при хранении в матричном виде
разреженного графа будут незначительны. Если же в
графе много ребер и он почти полный, то матрица
смежности всегда является лучшим способом хранения
графа. Однако если рассматриваемый граф является
деревом, то с учетом того, что каждая вершина может быть
связана только со своими родителем и потомками, то и
список смежности и матрица смежности неэкономично
расходуют память. В этом случае лучше воспользоваться
ссылочной структурой.

лекция 12

  • 1.
    Основные структуры данных 1. Стратегииреализации графов и деревьев
  • 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. Вопросы эффективности дляструктур данных Эффективность конкретной структуры данных зависит от задачи и ресурсов, имеющихся для ее решения. Если в графе много вершин, причем каждая из них связана лишь с небольшим количеством других вершин, список смежности оказывается выгоднее, поскольку он занимает меньше места, а длина просматриваемых списков вершин невелика. Если же число вершин в графе мало, то лучше воспользоваться матрицей смежности: она будет небольшой, и даже потери при хранении в матричном виде разреженного графа будут незначительны. Если же в графе много ребер и он почти полный, то матрица смежности всегда является лучшим способом хранения графа. Однако если рассматриваемый граф является деревом, то с учетом того, что каждая вершина может быть связана только со своими родителем и потомками, то и список смежности и матрица смежности неэкономично расходуют память. В этом случае лучше воспользоваться ссылочной структурой.