
- •1. Асимптотическая оценка алгоритма
- •2. Методика оценки не рекурсивных алгоритмов. Пример
- •3. Рекурсивные алгоритмы, построение асимптотической оценки. Пример
- •4. Методика оценки рекурсивных алгоритмов.
- •5. Алгоритмы сортировки массивов за полиномиальное время
- •6. Быстрые алгоритмы сортировки массивов, основанные на сравнении элементов
- •7. Алгоритмы сортировки массивов за линейное время
- •8. Линейные структуры данных, основные операции и характеристики
- •9. Деревья, виды, способы представления, структуры данных, обходы дерева
- •10. Двоичные деревья поиска, операции добавления элементов.
- •11. Двоичные деревья поиска, операции удаления элементов и поиска следующих
- •13. Двоичные кучи, основные операции и характеристики
- •16. Динамическое программирование, основные особенности
- •17. Жадные алгоритмы, основные особенности
- •18. Построение кода Хаффмена
- •19. Алгоритм обхода графов в ширину
- •20. Алгоритм обхода графов в глубину
- •21. Остовое дерево, классификация ребер, топологическая сортировка.
- •22. Сильно связные компоненты, алгоритм поиска
- •23. Построение минимально покрывающего дерева, алгоритм Крускала
- •24. Построение минимального покрывающего дерева, алгоритм Прима
- •25. Происк кратчайшего пути. Алгоритм Дейкстры
- •26. Поиск кратчайшего пути. Алгоритм Беллмана-Форда
24. Построение минимального покрывающего дерева, алгоритм Прима
Искомый минимальный остов строится постепенно, добавлением в него рёбер по одному. Изначально остов полагается состоящим из единственной вершины (её можно выбрать произвольно). Затем выбирается ребро минимального веса, исходящее из этой вершины, и добавляется в минимальный остов. После этого остов содержит уже две вершины, и теперь ищется и добавляется ребро минимального веса, имеющее один конец в одной из двух выбранных вершин, а другой — наоборот, во всех остальных, кроме этих двух. И так далее, т.е. всякий раз ищется минимальное по весу ребро, один конец которого — уже взятая в остов вершина, а другой конец — ещё не взятая, и это ребро добавляется в остов (если таких рёбер несколько, можно взять любое). Этот процесс повторяется до тех пор, пока остов не станет содержать все вершины (или, что то же самое, n-1 ребро).
В итоге будет построен остов, являющийся минимальным. Если граф был изначально не связен, то остов найден не будет (количество выбранных рёбер останется меньше n-1 ).
Prim(Gfw,г) {
for each (u in V) { // initialization
key[u] = +infinity;
color [u] = white;
}
key[r] =0; // start at root
pred [r] = nil;
Q = new PriQueue(V); // put vertices in Q
while (Q.nonEmpty()) { // until all vertices in MST
u = Q.extractMin(); // vertex with lightest edge
for each (v in Adj[u]) {
if ( (color [v] == white) && (w(u,v) < key [v]) ) {
key[v] = w(u,v); // new lighter edge out of v
Q.decreaseKey(v, key [v]) ;
pred [v] = u;
}
}
color[u] = black;
}
}
Анализ
Инициализация – O(V)
Цикл выполняется V раз и каждая операция extractMin выполняется за - O(logV) раз, всего O(V logV) раз
Цикл for выполняется O(E) раз, decreaseKey - за время O(logV) .
Общее время работы - O(V log V +E logV)= O(E logV)
25. Происк кратчайшего пути. Алгоритм Дейкстры
Задача поиска кратчайшего пути
Д
ан
граф G = (V. Е)
с весовой функцией w : Е
→ R.
Вес пути p = (v0, v1..... vk) равен суммарному весу входящих k в него ребер,
В
ес
кратчайшего пути из
вершины u в вершину v определяется
соотношением:
Кратчайший путь из вершины u в вершину v – это любой путь p, что w(p) = d(u, v)
Задача поиска кратчайшего пути
из заданной вершины во все остальные
между всеми парами вершин
Свойство кратчайшего пути
Пусть p = (v1, v2..... vk) - кратчайший путь из вершины v1 к вершине vk в заданном взвешенном ориентированном графе G = (У. Е) с весовой функцией w : Е → R a pij = (vi, vi+1.....vj) - частичный путь пути p, который проходит из вершины vi к вершине vj для произвольных i и j (1 ≤ i < j ≤ k). Тогдa pij – кратчайший путь из вершины vi к vi
Dijkstra(G, w, s) {
for each (u in V) { // initialization
d [u] = +infinity
color [u] = white
pred[u] = null
}
d[s] =0 // dist to source is 0
Q = new PriQueue(V) // put all vertices in Q
while (Q.nonEmpty()) { // until all vertices processed
u = Q.extractMin(} // select u closest to s
for each (v in Adj[u]) {
if (d[u] + w(u,v) < d[v]) { // Relax(u,v)
d [v] = d [u] + w(u,v)
Q.decreaseKey(v, d[v])
pred [v] = u
}
}
color [u] = black
}
[The pred pointers define an '1 inverted'' shortest path tree]
}