Алгоритм Δ-шагания: различия между версиями
[непроверенная версия] | [непроверенная версия] |
Daryin (обсуждение | вклад) (Общее описание алгоритма) |
Daryin (обсуждение | вклад) |
||
Строка 8: | Строка 8: | ||
=== Макроструктура алгоритма === | === Макроструктура алгоритма === | ||
=== Описание схемы реализации последовательного алгоритма === | === Описание схемы реализации последовательного алгоритма === | ||
+ | Псевдокод последовательного алгоритма: | ||
+ | |||
+ | '''Входные данные''': | ||
+ | граф с вершинами ''V'', рёбрами ''E'' с весами ''W''; | ||
+ | вершина-источник ''u''; | ||
+ | параметр ''Δ'' > 0. | ||
+ | '''Выходные данные''': расстояния ''d''(''v'') до каждой вершины ''v'' ∈ ''V'' от вершины ''u''. | ||
+ | |||
+ | '''procedure''' DeltaStepping(''V'', ''E'', ''W'', ''u'', ''Δ''): | ||
+ | ''LightEdges'' := { e ∈ E | W(e) ≤ Δ } | ||
+ | ''HeavyEdges'' := { e ∈ E | W(e) > Δ } | ||
+ | '''for each''' ''v'' ∈ ''V'' '''do''' ''d''(''v'') := ∞ | ||
+ | Relax(''u'', 0) | ||
+ | '''while''' any({ ''Buckets''(i) ≠ ∅ }): | ||
+ | ''Bucket'' := first({ ''Buckets''(i) ≠ ∅ }) | ||
+ | ''Deleted'' := ∅ | ||
+ | '''while''' ''Bucket'' ≠ ∅: | ||
+ | ''Requests'' := FindRequests(''Bucket'', ''LightEdges'') | ||
+ | ''Deleted'' := ''Deleted'' ∪ ''Bucket'' | ||
+ | ''Bucket'' := ∅ | ||
+ | RelaxAll(''Requests'') | ||
+ | RelaxAll(FindRequests(''Deleted'', ''HeavyEdges'')) | ||
+ | |||
+ | '''procedure''' Relax(''v'', ''x''): | ||
+ | '''if''' x < ''d''(''v''): | ||
+ | ''OldBucket'' := B(⌊''d''(''v'') / ''Δ''⌋) | ||
+ | ''NewBucket'' := B(⌊''x'' / ''Δ''⌋) | ||
+ | ''OldBucket'' := ''OldBucket'' \ {''v''} | ||
+ | ''NewBucket'' := ''NewBucket'' ∪ {''v''} | ||
+ | ''d''(''v'') := ''x'' | ||
+ | |||
+ | '''procedure''' RelaxAll(''R''): | ||
+ | '''for each''' (''v'', ''x'') ∈ ''R'' '''do''' Relax(''v'', ''x'') | ||
+ | |||
+ | '''function''' FindRequests(''V<nowiki>'</nowiki>'', ''E<nowiki>'</nowiki>''): | ||
+ | '''return''' { (''w'', ''d''(''w'') + ''W''(''v'', ''w'')) | ''v'' ∈ ''V<nowiki>'</nowiki>'' and (''v'', ''w'') ∈ ''E<nowiki>'</nowiki>''} | ||
+ | |||
=== Последовательная сложность алгоритма === | === Последовательная сложность алгоритма === | ||
Версия 17:44, 2 июня 2015
Содержание
- 1 Свойства и структура алгоритмов
- 1.1 Общее описание алгоритма
- 1.2 Математическое описание
- 1.3 Вычислительное ядро алгоритма
- 1.4 Макроструктура алгоритма
- 1.5 Описание схемы реализации последовательного алгоритма
- 1.6 Последовательная сложность алгоритма
- 1.7 Информационный граф
- 1.8 Описание ресурса параллелизма алгоритма
- 1.9 Описание входных и выходных данных
- 1.10 Свойства алгоритма
- 2 Программная реализация алгоритмов
- 2.1 Особенности реализации последовательного алгоритма
- 2.2 Описание локальности данных и вычислений
- 2.3 Возможные способы и особенности реализации параллельного алгоритма
- 2.4 Масштабируемость алгоритма и его реализации
- 2.5 Динамические характеристики и эффективность реализации алгоритма
- 2.6 Выводы для классов архитектур
- 2.7 Существующие реализации алгоритма
- 3 Литература
1 Свойства и структура алгоритмов
1.1 Общее описание алгоритма
Алгоритм дельта-шагания[1] предназначен для решения задачи поиска кратчайшего пути на графе. Для заданного ориентированного взвешенного графа с неотрицательными весами алгоритм находит кратчайшие расстояния от выделенной вершины-источника до всех остальных вершин графа. Алгоритм изначально проектировался с целью эффективной параллелизации.
1.2 Математическое описание
1.3 Вычислительное ядро алгоритма
1.4 Макроструктура алгоритма
1.5 Описание схемы реализации последовательного алгоритма
Псевдокод последовательного алгоритма:
Входные данные: граф с вершинами V, рёбрами E с весами W; вершина-источник u; параметр Δ > 0. Выходные данные: расстояния d(v) до каждой вершины v ∈ V от вершины u. procedure DeltaStepping(V, E, W, u, Δ): LightEdges := { e ∈ E | W(e) ≤ Δ } HeavyEdges := { e ∈ E | W(e) > Δ } for each v ∈ V do d(v) := ∞ Relax(u, 0) while any({ Buckets(i) ≠ ∅ }): Bucket := first({ Buckets(i) ≠ ∅ }) Deleted := ∅ while Bucket ≠ ∅: Requests := FindRequests(Bucket, LightEdges) Deleted := Deleted ∪ Bucket Bucket := ∅ RelaxAll(Requests) RelaxAll(FindRequests(Deleted, HeavyEdges)) procedure Relax(v, x): if x < d(v): OldBucket := B(⌊d(v) / Δ⌋) NewBucket := B(⌊x / Δ⌋) OldBucket := OldBucket \ {v} NewBucket := NewBucket ∪ {v} d(v) := x procedure RelaxAll(R): for each (v, x) ∈ R do Relax(v, x) function FindRequests(V', E'): return { (w, d(w) + W(v, w)) | v ∈ V' and (v, w) ∈ E'}
1.6 Последовательная сложность алгоритма
Средняя последовательная сложность алгоритма на графах со случайными весами [math]O(n + m + dL)[/math], где [math]L[/math] – максимальный суммарный вес кратчайшего пути, [math]d[/math] – максимальная длина кратчайшего пути.
1.7 Информационный граф
1.8 Описание ресурса параллелизма алгоритма
Средняя время работы параллельного алгоритма на графах со случайными весами на [math]O(n)[/math] процессорах составляет [math]O((dL + \ln n) \ln n)[/math] со средней работой [math]O(n + m + dL \ln n)[/math]
1.9 Описание входных и выходных данных
1.10 Свойства алгоритма
2 Программная реализация алгоритмов
2.1 Особенности реализации последовательного алгоритма
2.2 Описание локальности данных и вычислений
2.3 Возможные способы и особенности реализации параллельного алгоритма
2.4 Масштабируемость алгоритма и его реализации
2.5 Динамические характеристики и эффективность реализации алгоритма
2.6 Выводы для классов архитектур
2.7 Существующие реализации алгоритма
3 Литература
- ↑ Meyer, U, and P Sanders. “Δ-Stepping: a Parallelizable Shortest Path Algorithm.” Journal of Algorithms 49, no. 1 (October 2003): 114–52. doi:10.1016/S0196-6774(03)00076-2.