
X :Array [1..N,1..M] Of Integer;
(n – число вершин графа, m – число ребер), отражающей инцидентность вершин и ребер, где для неориентированного графа (рис
1, если
вершина vi
инцидентна ребру ej;
X [ i, j ] =
0, в противном случае;
Свойства:
а) такое представление полезно для задач, касающихся циклов;
б) обычно требует больше памяти, чем матрица смежности;
в) каждый столбец содержит ровно 2 единицы;
г) никакие два столбца не идентичны;
д) число единиц в i – строке равно степени вершины vi .
е) пространственная сложность этого способа R(n,m) = O(n*m). Временные сложности сведены в таблицу:
Операция |
Временная сложность |
Проверка смежности вершин x и y |
T(M*N) |
Перечисление всех вершин смежных с x |
T(M*N) |
Определение веса ребра (x, y) |
T(M*N) |
Определение веса вершины x |
Вес вершины не хранится |
Перечисление всех ребер (x, y) |
T(M) |
Перечисление ребер, инцидентных вершине x |
T(M) |
Перечисление вершин, инцидентных ребру s |
T(N) |
Матрица инцидентности лучше всего подходит для операции «перечисление ребер, инцидентных вершине x».
4. Перечень ребер. Это одномерный массив размером m, содержащий список вершин смежных с данной:
Type
TReb = Array [1..m] Of Record
v1, v2, {пара вершин, которые связывают ребро}
w: Integer; {вес ребра}
End;
Var G: TReb;
Пространственная сложность этого способа O(m). Временные сложности сведены в таблицу:
Операция |
Временная сложность |
Проверка смежности вершин x и y |
T(M) |
Перечисление всех вершин смежных с x |
T(M) |
Определение веса ребра (x, y) |
T(M) |
Определение веса вершины x |
Вес вершины не хранится |
Перечисление всех ребер (x, y) |
T(M) |
Перечисление ребер инцидентных вершине x |
T(M) |
Перечисление вершин инцидентных ребру s |
T(1) |
Как видно из таблицы, этот способ хранения графа особенно удобен, если главная операция, которой мы чаще всего будем пользоваться, это перечисление ребер или нахождение вершин и ребер, находящихся в отношениях инцидентности.
5. Векторы смежности. Форма представления – матрица, в i – строке которой содержится вектор, компоненты которого указывают на вершины, смежные с vi. (рис. ).
Свойства:
а) размер матрицы (n x smax), где smax – максимальная степень вершины в G;
б) удобно представлять граф, когда задача может быть решена за небольшое число просмотров каждого ребра в G.
Замечание. Можно отметить, что данный способ по сравнению с другими матричными способами содержит меньше нулевых элементов и более компактно отображается в памяти. Развитием такой формы представления графа в памяти является использование динамической (связной) структуры. Укажем вначале самый очевидный (в силу чего громоздкий и практически никогда не применяемый) способ представления графов с помощью динамической структуры. Например, ориентированный граф без всяких ухищрений представим в памяти следующим образом (рис. .):
Граф
|
|
Рис. . Представление графа в виде динамической (связной) структуры |
Совершенно ясно, что посредством ссылок можно выразить все связи в структуре, моделирующей ориентированный граф: вершинам графа соответствуют сами динамические переменные, а ребрам - ссылки. Однако, так как в графе может существовать дуга между любыми двумя вершинами, то необходимо заранее знать, какое количество указателей резервировать для динамической переменной, а после построения может оказаться, что в структуре содержится очень много нулевых указателей (содержащих Nil). Поэтому можно пойти другим путем, и первым шагом будет изучение классической структуры, называемой списками смежности.
6. Списки смежности. Представление графа с помощью списочной структуры, отражающей смежность вершин и состоящей из массива указателей на списки смежных вершин (рис. 6.8).
h :Array[1..n] Of u;
Список смежности содержит для каждой вершины v, принадлежащей V, список смежных ей вершин. Используя терминологию языка Pascal, можно утверждать, что каждый элемент такого списка является записью R, содержащей в поле R.i вершину графа, а в поле R.L - указатель на следующую запись в списке; ясно, что для последней записи в списке R.L содержит Nil.
Хранение
списков в динамической памяти позволяет
сократить объем расходуемой памяти,
так как в этом случае не будет
резервироваться место подn
соседей
для каждой вершины. Порядок
указания узлов в списке значения не
имеет. Заметим, что ссылка занимает 4
байта, поэтому для графов с большим
числом ребер будет затрачено больше
памяти, чем в матрице смежности.
Свойства:
а) обладает преимуществами динамической структуры;
б) списки независимы, и это может в некоторых случаях быть недостатком, если задача заключается в нахождении некоторых путей в графе;
в) для неориентированных графов каждое ребро представлено в списках смежности дважды;
г) число ячеек памяти, необходимое для представления графа с помощью списков смежности, будет иметь порядок |V|+|E|.
д) временные сложности сведены в таблицу:
Операция |
Временная сложность |
Проверка смежности вершин x и y |
T(N) |
Перечисление всех вершин смежных с x |
T(N) |
Определение веса ребра (x, y) |
T(N) |
Определение веса вершины x |
Вес вершины не хранится |
Перечисление всех ребер (x, y) |
T(M) |
Перечисление ребер инцидентных вершине x |
Номера ребер не хранятся |
Перечисление вершин инцидентных ребру s |
Номера ребер не хранятся |
Этот способ хранения лучше всех других подходит для операции «перечисление всех вершин смежных с x».
7. Список вершин и список ребер.[ Матьяш В.А., Путилов В.А., Фильчаков В.В. , Щёкин С.В.Структуры и алгоритмы обработки данных - Апатиты, КФ ПетрГУ, 2000. - 80 с.] Граф можно представить в виде списочной структуры, состоящей из списков двух типов - списка вершин и списков ребер (рис. ). Элемент списка вершин содержит поле данных и два указателя. Один указатель связывает данный элемент с элементом другой вершины. Другой указатель связывает элемент списка вершин со списком ребер, связанных с данной вершиной. Для ориентированного графа используют список дуг, исходящих из вершины. Элемент списка дуг состоит только из двух указателей. Первый указатель используется для того, чтобы показать в какую вершину дуга входит, а второй - для связи элементов в списке дуг вершины.
|
Рис. . Представление графа в виде списочной структуры (× − означает Nil)
|
Описание такой структуры выглядит следующим образом:
Type tV = ^Ver; { Тип: указатель на заголовочный узел }
tR = ^Reb; { Тип: указатель на дуговой узел }
{ Описание типа узла- вершины }
Ver = Record
i : Integer; { Имя заголовочного узла }
Lv: tV; { Указатель на следующий узел в списке вершин }
Le: tR; { Указатель на список смежности }
End;
{ Описание типа дугового узла }
Reb = Record
Id :tV; { Указатель на узел списка заголовочных узлов }
Next :tR { Указатель на следующий узел списка смежности }
End;
8. Структура с оглавлением. [Зубов В.С.] Если граф статичен, т. е. связи узлов неизменны, выгоднее ссылки изъять, а перечни узлов "уложить" в общий массив, а границы перечней указать в оглавлении. Подобная структура показана на рис. .
Элемент O[j] оглавления указывает, где в массиве начинается перечень узлов, смежных с j-м узлом, одновременно являясь границей предыдущего перечня (поэтому и понадобился последний элемент O[7] = 15). Массив содержит 2m элементов, оглавление — n + 1 элемент. Для изолированного узла начало перечня совпадет с началом следующего перечня, т. е. его перечень — пуст.
Перечни упорядочены и вот почему: проверка, существует ли ребро {i,j} является типичным действием; в неупорядоченном перечне i-ro узла эта проверка выполняется перебором, т. е. медленно, а в упорядоченном перечне возможен дихотомический (быстрый) поиск.
|
Рис. . Структура с оглавлением |
Структура с оглавлением не проигрывает (по расходу памяти) матрице смежности — двумерному массиву даже в случае полного графа.
Замечание. Ни один из рассмотренных способов представления графа в памяти не превосходит другой заведомо. В основе выбора подходящего способа должны лежать наши предварительные знания о графах, которые будут обрабатываться алгоритмом. Если в графе много вершин, причем каждая из них связана лишь с небольшим количеством других вершин, список смежности оказывается выгоднее, поскольку он занимает меньше места, а длина просматриваемых списков ребер невелика. Если же число вершин в графе мало, то лучше воспользоваться матрицей смежности: она будет небольшой, и даже потери при хранении в матричном виде разреженного графа будут незначительны. Если же в графе много ребер и он почти полный, то матрица смежности всегда является лучшим способом хранения графа.