
- •16. Обход n-арного дерева. Алгоритмы обхода n-арного дерева.
- •17.Бинарные деревья – основные определения, свойства и теоремы.
- •18,19.Не рекурсивные алгоритмы обхода бинарного дерева.
- •20.Поиск в упорядоченных таблицах. Последовательный поиск в массиве.
- •21.Поиск в упорядоченных таблицах. Двоичный поиск в массиве. Фибоначчиев поиск. Интерполяционный поиск.
- •22. Поиск в линейном списке.
- •23.Двоичное дерево поиска. Свойства. Основные операции.
- •Iterative_Tree_Search(t,k).
- •24. Добавление элемента в двоичном дереве поиска.
- •25. Удаление элемента в двоичном дереве поиска.
- •26. Абстрактная таблица. Основные операции. Способ реализации.
- •27. Авл – деревья. Свойства. Вращение. Высота авл-дерева (теорема) Определение и свойства авл-дерева
- •Авл - дерево
- •Повороты при балансировке
- •Алгоритм на псевдокоде
- •Алгоритм на псевдокоде
- •29. Удаление вершины в авл – дереве.
- •Алгоритм на псевдокоде
- •30. Красно – черные деревья. Свойства. Вращение. Высота красно – черного дерева.
- •Повороты
- •Операции поворота в бинарном дереве поиска
- •31. Добавление вершины в красно – черном дереве.
- •32. Удаление вершины в красно – черном дереве.
- •33. 2-3 Деревья. Основные свойства. Высота 2-3 дерева.
- •34 Обход 2-3 дерева.
- •35 Добавление элемента в 2 – 3 дерево.
- •36 Удаление элемента в 2 – 3 дереве.
- •37 2 – 3 – 4 Деревья. Основные свойства. Высота 2 – 3 – 4 дерева.
- •38 Добавление элемента в 2 – 3 – 4 дерево.
- •39. Стратегии внутренней сортировки.
- •40. Турнирная сортировка.
- •41. Пирамидальная сортировка.
- •42. Вставка с убывающим шагом.
- •43. Быстрая сортировка.
- •44. Быстрая двоичная сортировка.
- •45. Цифровая сортировка.
- •46. Карманная (блочная) сортировка.
- •47. Сортировка подсчетом
- •48. Сортировка слиянием. Рекурсивный алгоритм
- •49. Нижняя граница вычислительной сложности алгоритмов сортировки.
- •50. Поиск в глубину в графе. Рекурсивный алгоритм.
- •51. Поиск в ширину в графе. Не рекурсивный алгоритм.
- •52. Топологическая сортировка. Алгоритм топологической сортировки.
- •58. Стягивающие деревья. Нахождение стягивающего дерева методом поиска в ширину
- •59. Стягивающие деревья. Нахождение стягивающего дерева методом поиска в глубину.
- •60.Минимальные покрывающие деревья. Алгоритм Прима
- •61.Минимальные покрывающие деревья. Алгоритм Крускала.
- •62. Нахождение кратчайших путей в графе. Алгоритм Форда – Беллмана
- •63 Поиск кратчайших путей в графе. Алгоритм Дэйкстры.
- •64 Пути в бесконтурном графе.
- •65 Алгоритм Флойда поиска кратчайших путей между всеми парами вершин
- •66. Открытое хеширование.
- •67. Хеш-функции (ключи как натуральные числа, деление с остатком, умножение).
- •68. Закрытое хеширование. (Линейная последовательность проб. Квадратичная последовательность проб. Двойное хеширование).
- •69 Алгоритм Кнута-Морриса-Пратта.
- •70 Поиск подстрок. Алгоритм Бойера-Мура.
- •71. Поиск подстрок. Алгоритм Рабина-Карпа
- •72 Равномерный и неравномерный код. Префиксное кодирование.
- •73. Алгоритм Шеннона – Фано
- •74. Сжатие информации. Метод Хаффмана.
- •75. Исчерпывающий перебор. Задачи коммивояжера. Задача о назначениях.
- •77. Метод ветвей и границ. Задача о назначениях. Задача о рюкзаке. Задача коммивояжера.
- •Постановка задачи коммивояжера
- •Алгоритм решения задачи коммивояжера Жадный алгоритм
- •Полный перебор
- •78. Динамическое программирование. Восходящее и нисходящее динамическое программирование
- •79.Задача определения наиболее длинной общей подпоследовательности.
- •80. Перемножение последовательности матриц.
62. Нахождение кратчайших путей в графе. Алгоритм Форда – Беллмана
Будем
рассматривать ориентированные графы
G
= <V,
Е>, дугам которых приписаны веса. Это
означает, что каждой дуге (u,
v)E
поставлено в соответствие некоторое
вещественное число a(u,
v),
называемое весом данной дуги. Полагаем,
что a(u,
v)=
,
если не существует дуга (u,
v).
Если последовательность вершин
Vq
,
V1,...,
Vp
определяет путь в графе G,
то его длина определяется как сумма
.
Нас будет интересовать нахождение
кратчайшего пути между двумя фиксированными
вершинами s,
t
V.
Длину такого пути обозначим d(s,
t)
и назовем расстоянием от s
до t
(расстояние, определенное таким образом,
может быть и отрицательным). Если не
существует ни одного пути из s
в t,
то полагаем d(s,
t)
=
.
Отметим, что если каждый контур нашего
графа имеет положительную длину, то
кратчайший путь будет всегда элементарным
путем.
Для
произвольных s,
t
V
(s
t)
существует вершина v
такая, что d(s,
t)
= d(s,
v)
+ d(v,
t).
Таким свойством обладают предпоследние вершины кратчайшего пути из s в t. Далее мы можем найти вершину и, для которой d(s, v) = d(s, u) + d(u, v) и т.д. Из условия положительности длины всех контуров следует, что последовательность t, v, u, ... не содержит повторений и заканчивается вершиной s. Перечислив вершины в обратном порядке, найдем кратчайший путь из s в t.
Алгоритм для нахождения кратчайшего пути можно построить с использованием стека, куда последовательно заносим вершины t, v,u, ..., s:
1 BEGIN
СТЕК :=
; СТЕК t; v := t;
WHILE v
s DO
BEGIN
u := вершина, для которой d[v] = d[u] + a[u, v]
СТЕК u;
v := u
8 END
9 END
Отметим, что если выбор вершины и в строке 5 происходит в результате просмотра всех вершин, то сложность нашего алгоритма - 0(n2). Если же будем просматривать только список ПРЕДШ[у], содержащий все вершины и, такие, что u—>v, то сложность будет О(m).
Алгоритм Форда-Беллмана.O(n3) При данной матрице весов дуг a[u, v], u, ve V, вычисляем некоторые верхние ограничения d[v] на расстояния от вершины s до всех v е V.
Каждый раз, когда окажется, что D[u]+a[u, v]<D[v] (1), оценку D[v] улучшаем: D[v] := D[u]+a[u, v]. Процесс прерывается, когда дальнейшее улучшение ни одного из ограничений невозможно. Легко показать, что значение каждой из переменных D[v] в этом случае равно кратчайшему пути от s к v.
Таким
образом для вычисления расстояния от
s
до t
мы находим расстояние от s
до всех вершин графа. Алгоритм
Belman-Ford(G,A,S,t)1.for
each vV
do d[v]
2.d[S]<- 0; 3.for k=1 to n-1 do 4.for each v
V-{S}
do 5.for each w
V
do if d[v]>d[w]+a[w,v] then d[v] d[w]+a[w,v]
end for;end for; end for.
63 Поиск кратчайших путей в графе. Алгоритм Дэйкстры.
Общая теория:
У
нас есть граф G=(V,E),
где связь между вершинами v
и w
следующая: a(v,w)
E.
Если связь между вершинами отсутствует,
то a(v,w)=
.
Если последняя вершина wo, w1, …, wn определяет путь в графе, то его длина равна суммарному весу входящих вершин:
Наша задача – нахождение кратчайшего пути между вершинами S, t. M(S,t) – расстояние между S и t.
Путь из S в t, который имеет минимальную длину – есть кратчайший путь, между вершинами S и t.
d(S,t)=d(S,vk) + a(vk,t)
d(S,vk)=d(S,vk-1)+a(vk-1,vk)
vk-1
vk
t
S
Алгоритм Дейкстры позволяет найти путь с не отрицательными весами.
Алгоритм Dijkstra (G,A,S)
for each v
V do d[v]
;
d[s]
0; //путь до вершины S
S
; //множество вершин с известным расстоянием
t
v; //множество вершин с не известным расстоянем
while T
0 do;
d[w]=min {d[p], p
T};
S
SV{w}; T
T-{w};
for each v
T do;
if d[v] > d[w]+a[w,v] then;
d[v]
d[w] + a[w,v];
end for;
end while;
return d.
#
A 3 B 2
4 9 E
S 2 2
3
C 3 D
d[S]=0;
d[A]=;
d[B]=
;
d[C]=
;
d[D]=
;
d[E]=
;
S;
T={S, A, B, C, D, E};
d[A]=min{d[A], d[S] + a[S,A]=4};
d[B]=min{d[B], d[S] + a[S,B]=9};
d[C]=3; – Минимальное значение переносим во множество S;
d[D]=;
d[E]=;
S={S,C} T={A,B,D,E};
Пересчитываем
d[A]=min{d[A],
d[C] + a[C,A]}=min{4, 3 + }
= 4;
d[B]=min{d[B],
d[C] + a[C,B]}=min{9, 3 + }=9;
d[D]=min{d[D],
d[C] + a[C,D]}=min{,
3 + 3}=6;
d[E]
=;
S={S,C,A} T={B,D,E};
Пересчитываем
d[B]=min{d[B], d[А] + a[А,B]}=min{9, 3 + 4}=7;
d[D]=min{d[D], d[А] + a[А,D]}=min{6, 4 + 2}=6;
d[E]
=;
S={S,C,A,D} T={B,E};
Пересчитываем
d[B]=min{d[B],
d[D] + a[D,B]}=min{7, 6 + }=7;
d[E] = min{d[E], d[D] + a[D,E]}=8;
S={S,C,A,D,B} T={E};
Пересчитываем
d[E] = min{d[E], d[B] + a[B,E]}=min{9,8}=8;
S={S,C,A,D,B,E}
T=;