Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

алгоритмы / Struktury

.pdf
Скачиваний:
316
Добавлен:
18.03.2015
Размер:
1.3 Mб
Скачать

Структуры и алгоритмы компьютерной обработки данных

 

21

 

 

 

 

3

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

:

 

{ }.

 

 

 

 

 

 

добавляется в список.

 

 

 

 

 

{

}

{

}

 

 

4

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

:

 

{ }.

добавляется в список.

 

 

 

 

{

}

{

}

 

 

5

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

:

{}. добавляется в список.

 

 

{

}

{

}

 

 

6

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

:

 

{

}.

добавляется в список.

 

 

 

 

 

{

}

{

}

 

 

7

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

: .

 

 

добавляется в список.

 

 

 

 

 

 

{

}

{

 

}

 

8

Извлекаем из очереди первую вершину

. Помещаем в очередь смежные ей вершины

:

 

{

}.

добавляется в список.

 

 

 

{

}

{

}

9

. Конец алгоритма.

 

Полученный список

{

} содержит «маршрут» прохождения графа в ширину.

Замечание: прохождение не единственное. В зависимости от порядка добавления смежных вершин в стек, можно получить разную последовательность вершин.

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

. По окончанию модифицированной таким образом процедуры таблица содержит для каждой вершины её предыдущую вершину.

Анализ сложности алгоритмов поиска в глубину и в ширину.

В описанных алгоритмах поиска посещение каждой вершины требует времени вычисления ( ). Каждую вершину вне списка мы помещаем в стек. Требуется, чтобы каждая вершина была посещена. Аналогично и с поиском в глубину. При добавлении вершины в список обработанных вершин для обнаружения смежных с ней вершин проверяется строка матрицы смежности. Каждая строка – ( ), следовательно, общее время вычислений равно ( ) ( ) ( ). Число сравнений в случае матричного представления графа не зависит от количества ребер в графе. Даже если граф является разреженным, мы обязаны провести сравнений для каждой вершины.

При списковом представлении графа быстродействие алгоритма зависит от реберной плотности графа. В лучшем случае ребер нет и длина каждого списка равна . Тогда время вычисления для каждо-

го поиска (

)

( ) (

) . В худшем случае каждая вершина связана с каждой и длина

каждого списка смежных вершин равна

. Тогда сложность алгоритма равна ( ).

Структуры и алгоритмы компьютерной обработки данных

22

 

 

Эйлеров граф.

Долгое время существовала задача о семи кенигсбергских мостах. Эйлер показал, что карту можно свести к виду графа, и решил эту задачу с отрицательным ответом.

Эйлер, решая задачу о семи мостах, открыл следующие свойства графов: число нечетных вершин связанных графов всегда четно, невозможно начертить граф с нечетным числом нечетных вершин. Если все вершины графа четные, то можно одним росчерком, то есть, не отрывая карандаша от бумаги и проводя по каждому ребру ровно один раз начертить граф. При этом движение можно начинать с любой вершины графа и закончить её там же. Граф только с двумя нечетными вершинами можно начертить одним росчерком, при этом движение нужно начать в одной из этих вершин, а закончить его в другой такой вершине. Граф с более чем двумя нечетными вершинами невозможно начертить одним росчерком.

Поскольку число нечетных вершин графа задачи о семи местах равно 4, то такой граф невозможно пройти по всем семи мостам, побывав на каждом из них только по одному разу и не проходя при этом одного пути дважды.

Эйлеровым путем в графе называют путь, проходящий через каждое ребро графа в точности в один

раз, то есть путь

, такой, что каждое ребро появляется в этой последовательности в точно-

сти один раз. Если

, то такой путь называется эйлеровым циклом. Эйлеров цикл соответствует

обходу всех ребер графа, причем каждое ребро при таком обходе проходится точно один раз и только в одном направлении. Графы, в которых существует эйлеров цикл, называются эйлеровыми графами.

Эйлер представил необходимое и достаточное условие существования эйлерова пути. Эйлеров путь в графе существует тогда и только тогда когда граф связный и содержит не более чем две вершины нечетной степени.

Если в связном графе нет вершин в нечетной степени, то каждой эйлеров путь является циклом.

Алгоритм нахождения Эйлерова Цикла

Вход – связный граф без вершин нечетной степени представленный списком инцидентности, про-

межуточные данные – стек , выходные данные – содержащий эйлеров цикл.

( )

 

{

 

 

 

 

 

 

 

( ) помещение вершины

в вершину стека

 

 

(

(

))

 

 

 

 

 

{

 

 

 

 

 

 

 

()

 

 

в вершину

помещаем значение из вершины стека

 

(

)

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

 

первая смежная вершина

 

 

(

)

 

помещение вершины

в вершину стека

 

 

 

 

удаление из списка смежных с

вершин вершины

 

 

 

 

удаление из списка смежных с

вершин вершины

 

 

 

 

теперь, в качестве рассматриваемой вершины будет

.

}

 

 

 

 

 

 

 

{

 

 

 

 

 

 

 

 

 

()

удаляем вершину из стека

 

 

 

(

)

помещаем вершину

в стек

 

}

}

}

Принципы действия алгоритма можно объяснить следующим образом: пусть начальная вершина. Тогда цикл начинает строить путь с началом в , причем вершины этого пути помещаются в промежуточный стек, а ребра удаляются из графа, эти действия продолжаются вплоть до того момента, когда путь нельзя удлинить включив в него новую вершину, то есть когда .

Структуры и алгоритмы компьютерной обработки данных

 

 

23

 

 

Отметим, что тогда должно быть

, так как в любом другом случае это означало бы, что сте-

пень вершины

нечетная. Таким образом, из нашего графа был удален некоторый цикл

, а вершины

этого цикла находятся в промежуточном стеке. Если в цикл

вошли все ребра графа, то

– эйлеров

цикл, если в

не попали все ребра, то в графе, из которого удален цикл , степень произвольной

вершины остается четной. Вершина

равная

переносится из промежуточного стека в результирую-

щий, а очередной вершиной становится верхний элемент стека. Процесс повторяется, начиная с этой

вершины, если

. В результате, вследствие четности всех вершин, в промежуточный

стек помещается некоторый цикл, проходящий через вершину

это продолжается до того момента ко-

гда промежуточный стек не станет пустым. Очевидно, что вершины помещаемые в стек

обра-

зуют некоторый путь, причем вершина переносится в стек

только тогда, когда все ребра,

инцидентные с этой вершине представлены в одном из циклов. Поэтому по окончанию алгоритма содержит эйлеров цикл.

Пример Эйлерова Графа:

 

2

4

1

3

5

 

7

6

Анализ алгоритма.

 

 

Каждая итерация цикла

либо помещает вершину в промежуточный стек и удаляет ребро из

графа, либо переносит вершину из промежуточного стека в результирующий. Таким образом, число

итераций этого цикла ( ). Мы предполагаем, что каждая вершина в списке инциденций представлена

дважды. Это дает возможность устранить ребро {

} за время ограниченное константой.

 

ПРИМЕР: СМ. РИСУНОК CE: 1 4 10 9 8 4 3 7 6 5 3 2 1 Q: 1 2 3 5 6 7 3

 

 

4 8 9 10 4 1.

 

 

 

 

 

 

 

 

Сложность алгоритма: (

) если граф разреженный, (

) если граф полный.

Остовные деревья

 

 

 

 

Остовным деревом для связного неориентированного графа с

вершинами называется неориенти-

рованное дерево, содержащее все

вершин и

рёбер графа. Таким образом, остовное дерево свя-

зывает все вершины графа и из каждой вершины можно попасть в любую другую.

В полном графе с вершинами имеется

остовных деревьев, то есть для одного и того же графа

можно построить несколько остовных деревьев.

 

 

 

Основными задачами нахождения остовных деревьев графа является:

1)нахождение остовного дерева (для её решения можно использовать алгоритм поиска в ширину и

вглубину)

2)нахождение минимального и максимального остовного дерева.

Рассмотрим 2 алгоритма нахождения остовного дерева минимальной стоимости, при этом стоимость остовного дерева определяется как сумма стоимостей его рёбер.

Наиболее простым алгоритмом поиска остовного дерева минимального веса является алгоритм Прима, который заключается в следующем:

 

 

1)

выбирается некоторая вершина

и помечается как выбранная. Остальные

помечаются как

невыбранные;

 

 

 

 

 

 

 

 

 

 

 

2)

определяются веса между выбранной вершиной

и всеми остальными невыбранными вершина-

 

 

 

 

 

 

 

 

 

 

 

 

 

ми;

 

 

 

 

 

 

 

 

 

 

 

 

 

3)

выбирается вершина

с наименьшим весом до

, фиксируется выбранное ребро и ее вес;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4)

выбранная

вершина

исключается из перечня невыбранных, число невыбранных вершин

уменьшается на 1.

 

 

 

 

 

 

 

 

 

 

5)

Пункты 1-4

повторяются до тех пор, пока не будут выбраны все вершины, то есть

раз.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Структуры и алгоритмы компьютерной обработки данных

24

 

 

(так дано на лекции, я с этим не согласен. Даже с сопутствующим примером он расходится) моя интерпретация алгоритма Прима:

1) Все вершины графа помечаются как невыбранные, т.е. составляют множество невыбранных вер-

шин

;

 

 

 

2) Извлекается некоторая вершина

из множества невыбранных вершин и добавляется во множе-

ство выбранных вершин

;

 

 

3)

Рассматриваются все вершины из

, являющиеся смежными с вершинами из ;

4)

Выбирается ребро (

) (где

), имеющее наименьший из рассматриваемых ребер вес;

5)

Вершина извлекается из множества и помещается в

;

6)

Шаги 3-5 повторяются до тех пор, пока множество | |

.

Пример

1

2

4

5

6

 

1

 

1

1

 

 

 

 

 

2

 

 

2

 

 

 

2

 

 

3

 

 

3

 

3

 

 

3

4

8

5

 

4

 

 

 

7

 

 

7

5

 

6

5

6

 

 

 

 

 

 

 

 

 

 

итерация

Множество вы-

Невыбранные вершины,

Выбранное

Вес

Стоимость

бранных вершин

смежные с выбранными

 

ребро

ребра

остова

 

 

1

{

}

-

 

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

2

{

}

 

 

(

)

 

 

 

 

 

 

 

 

 

 

 

3

{

}

-

 

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

4

{

}

 

 

(

)

 

 

 

 

 

 

 

 

 

 

 

5

{

}

-

 

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

{

}

 

 

 

 

 

 

Алгоритм Крускала

Пусть имеется связный взвешенный граф с вершинами. Построение остовного дерева минимального веса начинается с графа , имеющего только вершин без рёбер. Таким образом каждая вершина оказывается связной только сама с собой. Построение дерева сводится к формирования набора связных компонент, постепенным объединением которых и формируется остовное дерево.

1)

Упорядочим множество рёбер в порядке возрастания их веса или стоимости

2)

Выберем ребро с наименьшим весом и включим его в граф . В этот момент в графе одна ком-

понента содержит 2 вершины и одно ребро, а

компоненты содержат только по одной вершине.

3)

Выбираем следующее наименьшее ребро и проверяем:

 

если оно связывает 2 вершины из разных компонент, то это ребро добавляем в граф .

если же граф связывает 2 вершины, принадлежащее одной компоненте, то такое ребро отбрасывается, так как его добавление в связанную компоненту приведет к образованию цикла.

Алгоритм заканчивает работу когда все вершины графа будут принадлежать только одной компоненте.

Структуры и алгоритмы компьютерной обработки данных

 

 

 

 

25

 

 

 

 

 

 

 

 

 

 

 

Пример: (граф тот же, что и в предыдущем примере)

 

 

 

 

 

 

 

Вес ребра

Ребро

Признак

 

стоимость

 

 

 

 

 

 

выбран.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

(

)( )( )( )( )

 

 

 

(

)

 

 

 

(

)( )(

)(

)

 

 

 

(

)

 

 

 

(

)(

)(

)

 

 

 

(

)

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

(

)( )

 

 

 

(

)

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

(

 

)

 

 

 

 

(

)

 

 

 

 

 

 

 

 

Алгоритм Дейкстры для нахождения кратчайшего пути

Среди десятков алгоритмов для отыскания кратчайшего пути, одним из лучших является алгоритм Дейкстры (по сути совпадает с алгоритмом Примы) и позволяет находить в графе кратчайший путь между выделенными вершинами и при положительных длинах дуг.

В процессе работы алгоритма вершинам графа приписываются метки, которые подразделяются на

постоянные и временные.

 

 

 

 

 

 

 

 

Обозначают временную метку

(

)

. Временная метка

для вершины

обозначает, что пока

не найдено расстояние от вершины .

 

 

 

 

 

 

Постоянная метка

( )

{

(

)

( )}. Вершина

получила на некотором шаге постоян-

ную метку, т.е. до этой вершины найден кротчайший путь из начальной вершины .

Пусть граф задан матрицей смежности

, в которой

 

 

 

 

 

 

 

 

 

 

 

 

 

 

( )

 

 

 

 

 

 

 

 

{

 

( )

 

 

 

 

Перед началом алгоритма все вершины имеют временную метку .

 

 

В ходе работы алгоритма, каждой вершине приписывается число (

), равное длине кротчайшего

пути из

в .

 

 

 

 

 

 

 

 

 

 

 

Пусть дан связный взвешенный граф с

вершинами.

 

 

 

 

– начальная вершина,

– конечная вершина

 

 

 

 

1)

 

,

( )

 

 

 

 

 

 

 

 

 

 

( )

 

, где

 

;

 

 

 

 

 

 

2)

Для всех вершин

, смежных с

и не имеющих постоянной метки, пересчитываются вели-

 

чины

(

) по следующей формуле

 

 

 

 

 

( )

 

 

{ ( ) ( )

(

)} ( )

 

 

 

 

 

Проверяется, если

( )

 

для всех непомеченных вершин

, то закончить процедуру ал-

 

горитма, т.к. в исходном графе отсутствуют пути из

в помеченные вершины.

 

Если не все

( )

, то выбрать ту из вершин, которая имеет наименьшую временную мет-

 

ку.

 

 

 

 

 

 

 

 

 

 

 

3)

Если

 

, то заканчивается работа алгоритма, т.к. кротчайший путь из

в найден.

Замечание

 

 

 

 

 

 

 

 

 

 

 

Если изменить условие останова алгоритма (не при

) на то, чтобы все временные метки стали

постоянными, то можно кротчайшие расстояния от вершины

до всех остальных вершин графа.

Структуры и алгоритмы компьютерной обработки данных

 

 

 

 

 

 

26

 

 

 

 

 

 

 

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

5

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

6

 

 

 

 

 

 

 

1

 

3

3

 

 

 

1

 

 

 

 

 

 

 

 

 

 

3

6

 

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

 

 

 

 

4

8

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

(

)

(

)

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

 

 

 

 

 

(

 

)

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5

 

 

 

 

 

 

 

(

 

)

(

)

10

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

 

 

 

 

 

 

(

)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Кротчайший путь из 1 в 8 весит 7

 

 

 

 

 

 

 

 

 

 

Соседние файлы в папке алгоритмы