
алгоритмы / Struktury
.pdfСтруктуры и алгоритмы компьютерной обработки данных |
|
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 |
|
|
|
|
|
|
|
|
|
|