
- •Предмет изучения дисциплины "Структуры и алгоритмы обработки данных на эвм". Абстрактные типы данных. Классификация структур данных.
- •Хеширование. Хеш-функции. Коллизии и методы их устранения. Сферы применения хеширования, достоинства метода.
- •Деревья: поисковое дерево, идеально - сбалансированное дерево, сбалансированное поисковое дерево, в-дерево. Рекурсивные методы прохождения деревьев. Алгоритмы построения деревьев.
- •Сферы применения графов. Способы машинного представления графов, их достоинства и недостатки.
- •Алгоритмы поиска в графе: поиск в ширину, поиск в глубину.
- •Эйлеров путь, эйлеров цикл, эйлеров граф. Алгоритм нахождения эйлерова цикла.
- •Нахождение кратчайших расстояний. Алгоритм Дейкстры.
- •Алгоритмы с возвратом.
- •Алгоритм нахождения гамильтоновых циклов в графе.
- •Метод ветвей и границ.
- •Остовные деревья графа. Алгоритмы нахождения дерева минимального веса: алгоритм Прима, алгоритм Крускала.
- •Эффективность алгоритмов и её составляющие. Алгоритмы и их сложность. Доминирование. О-функции и их особенности.
- •Правила для определения сложности. Функции, часто используемые для оценки сложности алгоритмов (список функционального доминирования). Сравнение алгоритмов с различными порядками сложности.
- •Анализ алгоритмов и определение их сложности по управляющим структурам. Контрольные замеры. Критический взгляд на о-анализ. (ограниченность о-анализа).
- •Полиномиальные алгоритмы и труднорешаемые задачи. Два аспекта труднорешаемости задач. Недетерминированное вычисление и класс np.
- •Теория np-полных задач. Структура класса np.
- •Методы решения np-полных задач. Применение теории np-полноты для анализа задач.
Эйлеров путь, эйлеров цикл, эйлеров граф. Алгоритм нахождения эйлерова цикла.
Эйлеров граф. Эйлеров путь. Эйлеров цикл. Алгоритм нахождения Эйлерова цикла.
Эйлеровым путем в графе называется произвольный путь, проходящий через каждое ребро графа в точности один раз.
Эйлеров цикл соответствует обходу всех ребер графа, причем каждое ребро при таком обходе проходится один раз и только в одном направлении. Граф, в котором существует Эйлеров цикл, называется Эйлеровым графом.
Необходимое и достаточное условие Эйлерова пути.
Эйлеров путь существует в графе когда граф связный и содержит не более чем 2 вершины нечетной степени.
Условие существования Эйлерова цикла
~ существует в графе, когда граф связный и в нём отсутствуют вершины нечетной степени.
Алгоритм нахождения Эйлерова цикла в графе
Пусть дан граф G=<V,E>, который связан и степень вершин которого имеют четную степень. Граф представлен списками инцидентности (lec[V])
Для промежуточного хранения используется стек STEC
Для хранения Эйлерово цикла используется стек CE.
STEC=0; CE=0;
V=V0 – произвольная начальная вершина
STEC <= V – занесение вершины в стек
while(STEC) do
5. V=TOP(STEC); - взять значение вершины стека
6. if (rec[V]) then do
7. U = V1 – первый элемент в списке rec[V]
8. STEC <= U;
9. rec[v] = rec / U; rec[U] = rec[U] / V; удаление ребра [V,U]
10. V=U; end
11. else V <= Stec; CE <= V; если rec[V]=0;
Принцип действия алгоритма можно обьяснить следующим образом: пусть V0 – вершина, выбранная в строке 2. Цикл while начинает строить этот путь сначала в V0, причем вершина этого пути помещается в промежуточный стек , а рёбра удаляются из графа. Эти действия продолжаются до момента, когда путь нельзя удлинить, включив в него новую вершину. В этот момент, когда путь нельзя удлинить, у нас должно быть что V = V0 .
На этот момент из нашего графа удалён цикл С1 и вершины этого цикла находятся в промежуточном стеке. Если в цикл С1 вошли все рёбра графа, то С1 является эйлеровым циклом. Если в цикл С1 вошли не все рёбра графа, то в оставшемся графе степень произвольной вершины останется четной. Вершину V = V0 переносим из промежуточного стека в результирующий (11), и процесс продолжается с очередной вершины V, которая является верхним элементом промежуточного стека. Эти действия продолжаются до момента, пока промежуточный стек не опустеет. По окончанию алгоритма, результирующий стек содержит эйлеров цикл.
Сложность алгоритма в худшем случае O(n^2)
Нахождение кратчайших расстояний. Алгоритм Дейкстры.
Задачи о кратчайших путях относятся к фундаментальным задачам комбинаторной оптимизации, так как многие такие задачи можно свести к отысканию кратчайшего расстояния и пути. Существуют различные типы задач о кратчайшем пути. Например, между двумя заданными вершинами, между данной вершиной и всеми остальными вершинами графа, между каждой парой вершин в графе, между двумя заданными вершинами для путей, проходящих или, наоборот, непроходящих через одну или несколько заданных вершин. Найти первый, второй и тд кратчайшие пути в графе.
Одним из лучших алгоритмов для отыскания кратчайшего пути принадлежит Дейкстре и был предложен в 1959 году. С помощью этого алгоритма можно решить следующую задачу:
Пусть дан граф G = <V, E>, к ребрам которого приписаны положительные веса. И требуется найти кратчайшее расстояние между фиксированной парой вершин S и T. В алгоритме Дейкстры выделяют две части:
1. Отыскание длины кратчайшего пути методом расстановки меток.
2. Отыскание собственно пути обратным ходом.
В процессе работы алгоритма вершинам графа приписываются метки, которые подразделяются на постоянные и временные. Постоянная метка приписывается вершине, до которой на текущем шаге найдено кратчайшее расстояние. Обозначим такую вершину через y. Временные метки X присваиваются вершинам, до которых пока не найдено кратчайшее расстояние.
Перед началом работы алгоритма все вершины имеют временные метки d(x) = ∞.
Зададим граф матрицой смежности, в которой a(I, J) = d(I, J), если ребро (I, J) существует.
a(I, J) = ∞, если ребро (I, J) не существует.
a(I, I) = 0, для всех I = 1…N
Алгоритм:
1. Выбираем начальную вершину S и присваиваем вершине S постоянную метку:
y = S
d(S) = 0
Всем остальным вершинам: d(x) = ∞.
2. Для всех вершин X, смежных с Y, и не имеющих постоянной метки, пересчитаем величины d(x) по следующей формуле:
d(x) = min{ d(x), d(y)+a(a, x) }
(1)
2/ |1
(S)4— (3)
5\ |1
(2)
d(1) = min { d(x), d(y) + a(y,x) } = min { d(1). d(S) + a(S, 1) } = min { ∞, 0 + 2 } = 2
d(2) = 5
d(3) = 4
Проверяем, если все d(x) = ∞, для всех непомеченных вершин X, то надо закончить процедуру работы алгоритма, так как в исходном графе отсутствуют пути из S помеченной вершины, В противном случае, выбрать ту из вершин X, которая имеет наименьшую временную метку.
3. Проверяем, если Y = T, закончить работу алгоритма, так как кратчайший путь из S в T найден. В противном случае перейти к шагу 2.
Простое изменение этого алгоритма позволит получить кратчайшие пути от S ко всем остальным вершинам графа, для этого нужно изменить правила остановки. Останавливаться не при Y = T, а в случае когда все пометки станут постоянными. Трудоемкость алгоритма при таком изменении не возрастет, так как вершина T в самом худшем случае получает постоянную метку самой последней, а в этой ситуации число шагов работы обоих алгоритмов одинаковы. Сложность алгоритма Дейкстры O(N^2).
С помощью рассмотренного алгоритма мы нашли расстояние между выделенными вершинами, а не сам путь. Однако, зная расстояние, мы можем при условии положительной длины всех контуров определить все кратчайшие пути. Для этого достаточно отметить, что для произвольных вершин S и T. Существует некоторая вершина V такая, что d(S,T) = d(S,V) + a(V,T). Таким свойством обладает произвольная вершина из S в T.
d(S,V) = d(S,V) - a(V,T)
Мы можем найти такую вершину U, для которой d(S,V) = d(S,U) + a(U,T).
Из положительной длины всех контуров следует, что созданная таким образом последовательность.
T → V → U … → S
Не содержит повторений и оканчивается на S. Она при обращении очередности и определяет кратчайший путь из S в T.
Опишем другой вариант реализации алгоритма Дейкстра.
Алгоритм использует три массива, каждый размерности N, где N - число вершин.
Массив А - содержит метки с двумя значениями. (0 - временная метка, 1 - )
Массив B - содержит текущее кратчайшее расстояние от вершины S до соответствующей вершины.
Массив C - содержит номера вершин, причем Ck - номер предпоследней вершины на текущем кратчайшем пути из S в T. Матрица смежности так же, как и в первом случае.
Основные шаги алгоритма:
1. Перед началом работы заполняем массив A нулями, массив B значением бесконечность, массив C = 0.
Пусть i - номер начальной вершины (S).
Присвоим a[i] = a[S] = 1 (обозначаем как помеченную).
c[i] = 0.
Перенесем i-ую строку матрицы смежности в массив B.
Заполним числом i массив C.
2. Найти минимум среди непоченных вершин, для которых a[k] = 0. Пусть этот минимум достигается на индексе j.
b[j] = min{ b[k] }
a[j] = 1
bk = min { bk, bj + djk }
Если bk > bj + djk = > bk = bj + djk
Если a[k] = 0 или a[t] = 0, то работа по нахождению кратчайшего расстояния закончена и длина пути от Vi до Vk равна Vk.
3. Определение самого пути.
3.1. Напечатать T
3.2. z = c[t]
3.3. Напечатать z
3.4. z = c[z]
Проверить, если z=0, то закончить выдачу ответа, иначе перейти к шагу 3.3