- •1. Цели и задачи курса «Теоретические основы информатики».
- •2. Асимптотическое сравнение целочисленных функций.
- •31. Основные понятия теории графов.
- •33. Внутреннее представление графа.
- •34. Алгоритм обхода вершин графа "в глубину".
- •35. Алгоритм обхода вершин графа "в ширину".
- •36. Сравнение свойств алгоритмов обхода "в глубину" и "в ширину".
- •38. Построение остовного дерева с заданной корневой вершиной.
36. Сравнение свойств алгоритмов обхода "в глубину" и "в ширину".
1. Если надо просмотреть абсолютно все вершины графа, то оба алгоритма по эффективности равносильны.
2. При поиске пути между двумя заданными вершинами, алгоритм в глубину находит первый попавшийся путь, как правило быстрее чем алгоритм в ширину.
При этом в стеке автоматически формируется маршрут пути. Однако этот путь как правило не является кратчайшим.
3. Алгоритм в ширину находит заведомо кратчайший путь, но как правило ищет его дольше и маршрут может быть получен только после достижения конечной вершины с помощью дополнительного этапа построения маршрута от конца к началу.
В глубину. девиз: «Двигайся вперед, пока это возможно и отступай минимально назад, если пути вперед уже нет».
В ширину. девиз: «Не удалять подысходные вершины, пока не рассмотрены все ближние вершины по отношению к исходной».
39. Поиск кратчайшего пути во взвешенном графе. Алгоритм Дийкстра.
На практике важной задачей является определение кратчайшего пути между двумя вершинами в смысле его длины (стоимости, времени и т.д.). Этой задаче соответствует задача поиска кратчайшего пути во взвешенном графе.
Взвешенный граф – это граф, каждому ребру (дуге) которго поставлена в соответствие некоторое число, которое называется весом ребра (дуги).
Если в графе найден
некоторый путь
,
то сумма
- длина пути.
- вес ребра
.
Т.к. между ребрами может существовать много путей и каждый из них имеет свою длину, то минимальная длина пути между заданными вершинами называется расстоянием.
Взвешенный граф удобнее всего задавать с помощью матрицы весов, которая похожа на матрицу смежности.
При решении задачи
на компьютере
-и
заменяются каким-либо большим числом,
заведомо превышающим разумные значения
длин (расстояний).Не всегда прямой проезд
из одной вершины в соседнюю бывает
короче всех остальных путей.
Пусть требуется
найти расстояние между двумя заданными
вершинами
.
Существует довольно много алгоритмов
решения этой задачи, однако все они
обладат одинаковым недостатком: для
поиска кратчайшего пути от заданной
вершины
до заданной вершины
приходится искать кратчайшие пути от
заданной вершины
до всех остальных вершин. На каждом шаге
этого алгоритма определяется кратчайшее
расстояние до некоторой вершины. Заранее
неизвестно на каком шаге определится
кратчайшее расстояние до заданной
вершины
.
Все алгоритмы основаны на одной и той
же идее.
1. Задаются начальные оценки сверху для расстояний от -той вершины до всех остальных (такие значения, относительно которых можно гарантировать, что расстояние наверняка будет не больше заданных оценок).
2. Многократно делается попытка улучшить оценку сверху для каждого расстояния от -той до остальных за счет проезда через некоторую третью вершину.
Например, известна
оценка сверху
.
Если найдется вершина
,
такая что
,
то
.
Процесс улучшения оценки заканчивается, если а) определилось расстояние до заданной конечной вершины, б) определились все расстояния от -той вершины до всех остальных.
Для случая неотрицательных весов ребер, наиболее рациональный алгоритм определения кратчайшего расстояния между двумя заданными вершинами предложил голландский информатик Дийкстра (1957 г.).
В этом алгоритме используются три массива по n элементов.
1) d: Array [1..n] of Real; - содержит текущие оценки сверху расстояний от -той вершины до всех остальных. Первоначальные значения оценок берутся из -той строки матрицы весов.
2) f: Array [1..n] of Boolean; - массив флагов для каждой вершины. В этом массиве элементы, соответствующие вершинам до которых определились кратчайшие расстояние имеют значение True. При решении задачи об кратчайшем расстоянии до вершины алгоритм заканчивается когда f[j]=True.
3) p: Array [1..n] of Word; - этот массив содержит номера вершин, из которых делается последний переход в каждую вершину.
Авторский алгоритм Дийкстра позволял найти только значение длины пути, а не маршрут от до вершины.
Мы рассматриваем модифицированный алгоритм Дийкстра, в котором с помощью вспомогательного массива р определяется маршрут соответствующий кратчайшему расстоянию. Он записывается от конечной вершины к началу.
Опишем алгоритм Д. словами.
1. Инициализация. Заполним массив d значениями из -той строки матрицы весов d[l]:=a[I,l]. в массив флагов запишем для всех вершин значения false, а для -той вершины значение True.
при
f[l]:= false; f[
]:=True.
В массив р во все ячейки запишем р[l]:= ; р[ ]:=0. В дальнейшем будем повторять одинаковые процедуры.
2. Общий шаг.
а) Среди всех неотмеченных вершин найдем вершину с минимальной оценкой расстояний сверху. Пусть эта вершина k. Тогда значение - и есть минимальная длина пути, т.к. любой другой путь в k-тую вершину через некоторую другую вершину в качестве 1-го отрезка содержал бы более длинное ребро, а проезд по 2-му ребру имеет неотрицательный вес. Отметим k-тую вершину в массиве f.
б) Полпробуем улучшить оценки сверху для еще не отмеченных вершин за счет проезда через k-тую вершину.
- неотмеченная вершина
if d[j]>d[k]+a[k,j]
Then d[j]:=d[k]+a[k,j]
3. Завершение алгоритма. Повторение общего шага завершается когда определится кратчайшее расстояние до заданной конечной вершины.
