Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lektsii_TRPO / Графы_представление_Lec.doc
Скачиваний:
61
Добавлен:
12.03.2015
Размер:
1.1 Mб
Скачать

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 узла эта проверка выполняется перебором, т. е. медленно, а в упорядоченном перечне возможен дихотомический (быстрый) поиск.

Рис. . Структура с оглавлением

Структура с оглавлением не проигрывает (по расходу памяти) матри­це смежности — двумерному массиву даже в случае полного графа.

Замечание. Ни один из рассмотренных способов представления графа в памяти не превосходит другой заведомо. В основе выбора подходящего способа должны лежать наши предварительные знания о графах, которые будут обрабатываться алгоритмом. Если в графе много вершин, причем каждая из них связана лишь с небольшим количеством других вершин, список смежности оказывается выгоднее, поскольку он занимает меньше места, а длина просматриваемых списков ребер невелика. Если же число вершин в графе мало, то лучше воспользоваться матрицей смежности: она будет небольшой, и даже потери при хранении в матричном виде разреженного графа будут незначительны. Если же в графе много ребер и он почти полный, то матрица смежности всегда является лучшим способом хранения графа.

Соседние файлы в папке Lektsii_TRPO