- •1. Общая классификация структур.
- •4. Стек. Доступ к элементу стека, адресация элемента. Алгоритмы исключения и включения элемента стека. Варианты конкретной реализации стека.
- •5. Очереди. Алгоритмы включения, исключения элемента и очистки очереди. Конкретная реализация очереди.
- •10. Разреженные матрицы, примеры их использования. Методы обработки разреженных матриц.
- •11. Деревья. Виды деревьев и способы их представления.
- •12. Двоичные деревья. Обход двоичных деревьев. Двоичные деревья поиска (ддп). Алгоритмы поиска в ддп.
- •18. Пути в графах. Алгоритм поиска Эйлерова и Гамильтонова пути в графе.
- •15. Матричное и списковое представление графов.
- •16. Поиск путей в графах. Алгоритм поиска в глубину. Алгоритм поиска в ширину.
- •17. Алгоритм построения каркасов в графе.
15. Матричное и списковое представление графов.
Граф – пара G=<V,E>, В – конечное множество вершин, Е – множество ребер (пар вершин).
Матрица инциденций А(NxM) – н строк по числу вершин, и м столбцов по числу рёбер. Столбец, соответствующий ребру <Х,У> содержит 1 в строке, соответствующей вершине Х и -1 в строке, соответствующей У (для орграфа; для неорграфа – обе 1) и 0 в остальных строках.
Более эффективно представление матрицей смежности B(NxN) – н строк и столбцов по числу вершин. Элемент b[ij]=1, если есть ребро из вершины I в вершину J и 0в противном случае.
Возможно представление графа списком ребер, тогда требуемый объём памяти – всего лишь 2*M.
Во многих случаях лучшее решение для представления графа – список инциднтности. Для каждой вершины V содержится список вершин U таких, что V->U; каждый элемент списка инцидентности является записью, содержащей вершину и указатель на следующий элемент. При этом начало каждого списка хранится в таблице BEG, т.е. BEG[V] – указатель на начало списка вершин, непосредственно связанных с вершиной v.
16. Поиск путей в графах. Алгоритм поиска в глубину. Алгоритм поиска в ширину.
Поиск в глубину из вершины v основан на поиске в глубину из всех новых вершин, смежных с v. Используются массивы New «новости» вершин и Zap списков смежности вершин. Изначально все вершины помечены как новые; при вызове функции поиска для вершины V для всех вершин U из её списка смежности, не являющихся новыми, происходит вызов функции поиска.
Поиск в ширину использует очередь. Для каждой вершины V производится просмотр всех смежных с ней вершин U, являющихся новыми; вершина U при этом помещается в очередь. Параллельно формируется список кратчайших путей в каждую вершину U из вершины V – для каждой просмотренной вершины V есть Prev[V], из которой произведён
17. Алгоритм построения каркасов в графе.
Каркасом графа <V,E> называется дерево <V,T>, где Т принадлежит Е; множество вершин каркаса совпадает с множеством вершин самого графа.
Алгоритм построения каркаса схож с алгоритмом поиска в глубину. Вначале все вершины графа помечаются как «новые», множество ребер каркаса пусто. Вызывается функция поиска для стартовой вершины.
При вызове функции для некоторой вершины V, с вершины снимается метка «новости»; для всех вершин U из её списка смежности, являющихся новыми, ребро {V,U} добавляется к списку рёбер каркаса, а затем для вершины U вызывается функция поиска.
Возможна реализация алгоритма с использованием поиска в ширину – в нём также все «новые» вершины U из списка смежности V заносятся в очередь обработки, а ребра {V,U} добавляются в список рёбер каркаса.
18. Пути в графах. Алгоритм поиска Эйлерова и Гамильтонова пути в графе.
Произвольный путь в графе, проходящий через каждое ребро графа ровно один раз, называется эйлеровым; по одним и тем же вершинам путь может проходить неоднократно. Эйлеров путь представляется последовательностью вершин в рабочем стеке ST, а стек SE содержит последовательность полностью обработанных вершин.
Алгоритм построения эйлерова пути: изначально оба стека пусты. Выбирается произвольная вершина графа V и заносится в список ST. Далее, пока ST не пуст, в V выбирается верхний элемент рабочего стека ST. После этого каждая вершина U из списка смежности V помещается в рабочий стек, ребро {V,U} удаляется из списка смежности V и U. После того, как список смежности V становится пустым, V удаляется из рабочего стека и помещается в результирующий стек SE. Процесс повторяется.
Путь в графе, проходящий через каждую ВЕРШИНУ ровно один раз, называется гамильтоновым. Не существует ни одного простого необходимого и достаточного условия для существования ГП в графе.
В глобальном векторе X строится последовательность вершин X[1],…X[k-1] строящегося пути; логический вектор DOP показывает, можно ли вставить вершины в проектируемый путь, n – кол-во вершин графа.
Procedure Ham(k); {}
Begin
For u in ZAP[X[k-1]] do
If (k=n+1) {если все вершины уже вставлены в путь}
And (u=v0) {и если последняя в-на в пути совпадает с 1-ой}
{т.е. это цикл}
Then Write(X[1],…X[k-1],v0) {печать пути и возможное окончание
алгоритма}
Else
If DOP[u] {если вершину можно вставить в путь}
Then
Begin
X[k] <- u; DOP[u] <- False;
If k<= n Then
Ham(k+1); {очередное удлинение пути привело в тупик –}
Else
DOP[u] <- True;
{необходимо вернуться для следующей попытки}
End;
End; {Ham}
Begin
For v in V do DOP[v] <- True; {инициализация}
X[1] <- v0; {v0 – произвольная фиксированная вершина графа}
DOP[v0] <- False;
Ham(2); {начало построения пути длиной 2}
End.
19. Алгоритм поиска кратчайших путей в графе.
Алгоритм Дейкстры – используется для определения кратчайшего пути из одной вершины графа в остальные. Однако он работает только на неотрицательных весах рёбер. Для поиска во взвешенном графе с отрицатльными ребрами используется алгоритм Беллмана-Форда. Находит кратчайшие пути от одной верины графа до всех остальных.
Procedure Bellman_Ford(G,w,S)
Initz(G,S)
for i:=1 to |V[G]| - 1 //для всех вершин кроме S
do
for каждого ребра UV in E|G|
do
Relax(U,V,w) //релаксируем каждое ребро
for каждого ребр UV in E|G| //проверяем нет ли отрицательного цикла
do
if (D[v] > D[u] + w(u,v)
then
return false; //отрицательный цикл
return true;
На выходе получаем граф, с размеченными вершинами – кратчайшими дистанциями до этой вершины от точки S.
20. Алгоритм поиска кратчайших путей между всеми вершинами графа.
Алгоритм Флойда-Уоршелла используется для нахождения кратчайших путей между всеми вершинами взвешенного ориентированного графа. Используется матрица A размером n*n, в которой вычисляются длины кратчайших путей.
Procedure Floyd_Warshall - алгоритм Флойда – Уоршалла O(n3)
{минимальный путь между всеми вершинами}
N <- размер матрицы A
D(0) <- A начальная матрица D содержит A
For K <- 1 to N
Do For I <- 1 to N
Do For J <- 1 to N
Do d(k) i,j <- min (d (k-1) I,j , d (k-1) i,k + d (k-1) k,j)
